【问题标题】:Rows cannot be added after data bound from sql table从sql表绑定数据后无法添加行
【发布时间】:2014-09-05 18:06:08
【问题描述】:

对不起,我正在为此苦苦挣扎,我已经尝试了此处列出的所有解决方案,但没有一个有效。我是 C# 新手,我需要你的帮助, 我让人们扫描要在 datagridview 控件中输入的项目。使用下面的代码,我在 DVG 中搜索一个值,然后根据该值是否存在添加一个新的 dvg 行。

public void InnerLoadData()
{
     if (textBox1.Text != string.Empty)
     {
         textBox1.DataBindings.Clear();
         textBox2.DataBindings.Clear();
         ScanID.DataBindings.Clear();
         CardNumber.DataBindings.Clear();
         Boolean result = true;

         string searchValue = ScanID.Text;
         dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
         foreach (DataGridViewRow row in dataGridView1.Rows)
         { 
             if ( row!=null && 
                row.Cells [3].Value != null && 
                row.Cells[3].Value.ToString() .Equals +(searchValue) && 
                row.Cells [4].Value.ToString()=="OUT" && 
                dataGridView1 !=null  )
             {
                 row.Selected = true;
                 row.SetValues(textBox1.Text, 
                     textBox2.Text,
                     CardNumber.Text,
                     ScanID.Text, 
                    "IN",
                     DateTime .Now );
                 row.DefaultCellStyle.BackColorColor.Green ;                           
                 result = false;
                 break ;
              }
         }

         if (result !=false )
         {                                  
             this.dataGridView1.Rows.Add(textBox1.Text, 
                textBox2.Text,
                CardNumber.Text,
                ScanID.Text, 
                "OUT",
                DateTime.Now); **// got error here**
             this.dataGridView1.RowsDefaultCellStyle.BackColor = Color.Red ;                                       
         }
     }
 }

这是我的问题,

为了以防万一,我将所有 datagridview 数据保存到 FormClosing 上的 sql 表中, 当我从 sql 重新加载数据并尝试添加新的 datagridview 行时,我收到了上面的消息。 知道如何解决吗?谢谢。

private void reloadToolStripMenuItem_Click(object sender, EventArgs e)
{
    BindingSource bsdata1 = new BindingSource();
    dataGridView1 .AutoGenerateColumns = false;
    dataGridView1 .AutoGenerateColumns = false;
    //DataGridView1.DataSource = Nothing
    using (SqlCommand cmd = new SqlCommand("get_badge", _econnect))
    {  cmd.CommandType = CommandType.StoredProcedure;
        SqlDataAdapter ad = new SqlDataAdapter(cmd);
        ad.Fill(dt1);
        bsdata1.DataSource = dt1;
    dataGridView1 .DataSource  =  bsdata1 ;     
}
}}}}

【问题讨论】:

标签: c#


【解决方案1】:

当 DataGrid 已经绑定到 dataTable 时,您不能向它添加行。

您应该将数据添加到 DataTable 本身。

dataGrid.DataSource 属性中获取DataTable(或者最好将其存储在某个地方),使用DataTable.NewRow 方法创建具有相同架构的新行,将其DataRow.ItemsArray 属性和add it 设置为相同的DataTable。

if (result !=false )
{     
     DataTable dt =  (DataTable)this.dataGridView1.DataSource;

     DataRow row = dt.NewRow();

     row.ItemsArray = new Object[]
     {
         textBox1.Text, 
         textBox2.Text,
         CardNumber.Text,
         ScanID.Text, 
         "OUT",
         DateTime.Now
     };

     dt.Rows.Add(row);                                      
 }

编辑:

可能只有两个地方NullReferenceException 可能会出现此类修改 - this.dataGridView1.DataSource 未设置或 CardNumber(ScanID) 为空(当然,如果它们在表单控件上不是静态的)。

通过初始化这些控件来修复第二种情况(如果是这种情况)。
第一种情况:

1. 在表单初始化时加载 dataTable - 将reloadToolStripMenuItem_Click 调用放在表单构造函数的末尾。

2.或者在没有DataSource的情况下不添加任何东西:

if ((result != false) && 
    (this.dataGridView1.DataSource != null))
{  
     DataRow row = ...

3. 如果您确实需要将项目添加到空的未绑定 DataGridView,那么您将不得不使用一些虚拟 DataTable(或其他 DataSource)并将其与 reloadToolStripMenuItem_Click 上加载的 DataTable 合并。

【讨论】:

  • 我已经尝试过了,但它不起作用,它给了我错误“引用未设置为实例...”正常的例程是用户扫描项目并将这些项目添加到 dvg。所以当应用程序从你上面的代码开始时,它给了我参考错误。只有在应用程序关闭的情况下,用户才能从 sql 重新加载数据。
猜你喜欢
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
相关资源
最近更新 更多