我是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:'对象引用未设置为对象的实例。'
有什么想法吗?
答案 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中的最后一个空行