读取下一行DataGridView每个按钮单击

时间:2017-05-23 23:25:55

标签: datagridview

我是C#的新手,自学。

出于学习目的,每次单击按钮并将值显示到文本框中时,我都会尝试读取特定列的行内容。 DataGridView有大约10行10列。为此,这是我到目前为止的代码:

private void button7_Click(object sender, EventArgs e)
    {
        int rowscount = dataGridView1.Rows.Count;
        for (int i = 0; i < rowscount; i++)
        {
           textBox1.Text = 
dataGridView1.Rows[i].Cells["Columnname"].Value.ToString();

        }
     }

我尝试切换行:dataGridView1.Rows [ i ]。Cells [“Columnname”]。Value.ToString(); to dataGridView1.Rows [ 1 ]。Cells [“Columnname”]。Value.ToString()并正确读取“Columname”列的 1 行并放入textBox1。但是,当我再次切换到[ i ]时,会显示以下错误:

System.NullReferenceException:'对象引用未设置为对象的实例。'

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我猜你的上一条评论,当你点击按钮时,文本框会显示下一行的下一个值。如果是这种情况,那么您将需要创建一个全局变量来跟踪网格中的下一行索引。例如,当程序启动时,此buttonIndex将为零(0),在用户单击按钮后,buttonIndex将为一(1),依此类推。如果buttonIndex的值等于网格中的最后一行索引,那么我们需要将buttonIndex的值重置为零(0)以在第一行的顶部重新开始。

一些问题尚不清楚。例如,假设文本框中的当前文本显示网格中第四行(4)的值。然后用户“删除”第四行(4)。文本框不会更改,并将继续显示现在已删除的第四行中的值。然后,如果用户单击按钮...由于按钮索引位于第四行(4),下一个索引将是五(5),因此代码将跳过一行。在此示例中,将跳过初始行5(删除第4行之前)。

如果允许用户删除行,则必须相应地调整buttonIndex。如果您不解决此问题,则文本框可能会显示不在网格中的文本。最糟糕的是它会甩掉当前的buttonIndex并崩溃。

以上问题是您必须解决的问题。下面是根据您的要求循环遍历行的代码,但是,如果删除了行,则不会更新buttonIndex。这意味着用户可以删除文本框中显示的当前行,并且文本框不会更改,直到用户单击该按钮并且可能跳过一行。虽然用户删除了行,但仍有几项检查可以使buttonIndex保持在现有行的范围内。我希望这是有道理的。

您确定,如果用户更改行选择,您不希望文本框更新吗?

代码说明

全局变量buttonIndex用于保持网格的行索引。注意:如果用户删除一行或多行,则行buttonIndex中网格中的文本和文本框中的当前文本可能不同。因此,进行检查以使buttonIndex保持在网格行的范围内。

int buttonIndex = 0;

private void button7_Click(object sender, EventArgs e) {

  if (buttonIndex >= dataGridView1.Rows.Count || dataGridView1.Rows[buttonIndex].IsNewRow)
    buttonIndex = 0;

  if (dataGridView1.AllowUserToAddRows == true) {
    if (dataGridView1.RowCount > 1)
      textBox1.Text = dataGridView1.Rows[buttonIndex].Cells["Columnname"].Value.ToString();
    else
      textBox1.Text = "";
  } else {
    if (dataGridView1.RowCount > 0)
      textBox1.Text = dataGridView1.Rows[buttonIndex].Cells["Columnname"].Value.ToString();
    else
      textBox1.Text = "";
  }
  buttonIndex++;
}

答案 1 :(得分:0)

必须设置条件:

for (int i = 0; i < rowscount; i++)

至:

for (int i = 0; i < rowscount-1; i++)

必须删除datagridview中的最后一个空行