我有一个数据网格视图,其中复选框列为第1列。我们想要的是当用户检查行时,所有选中的行应该转到另一个Form中的文本框。我写了以下内容来做到这一点。但问题是虽然检查了超过1行,但始终将最后检查的行数据发送到下一个表单。并非所有已检查的行数据
private void btngnvoucher_Click(object sender, EventArgs e)
{
// foreach(DataGridViewRow row in dataGridView1.Rows)
for (int x = 0; x < dataGridView1.RowCount;x++ )
{
// DataGridViewCheckBoxCell ch1 = (DataGridViewCheckBoxCell)row.Cells[0];
DataGridViewCheckBoxCell ch1 = (DataGridViewCheckBoxCell)dataGridView1.Rows[x].Cells[0];
if (ch1.Value != null)
{
for (int a = 0; a < 6; a++)
{
for (int col = 1; col < 5; col++)
{
TextBox theText1 = (TextBox)vobj.Controls[col - 1];
// theText1.Text = row[x].Cells[col].Value.ToString();
theText1.Text = dataGridView1.Rows[x].Cells[col].Value.ToString();
}
// a = a + 1;
break;
}
}
}
vobj.Show();
}
}
}
任何人都能告诉我我能做些什么来解决这个问题吗?
答案 0 :(得分:0)
而不是:
theText1.Text = dataGridView1.Rows[x].Cells[col].Value.ToString();
尝试:
theText1.AppendText(dataGridView1.Rows[x].Cells[col].Value.ToString());
答案 1 :(得分:0)
您的问题的原因似乎是您希望变量a
执行某些操作而不对其执行任何操作。看起来这是为了引用一行文本框,然后由查看单元格的代码填充。
正如这段代码所示:
for (int col = 1; col < 5; col++)
{
TextBox theText1 = (TextBox)vobj.Controls[col - 1];
// theText1.Text = row[x].Cells[col].Value.ToString();
theText1.Text = dataGridView1.Rows[x].Cells[col].Value.ToString();
}
为每一行填充相同的四个文本框。
那就是说,你的代码还有很多其他的问题,修复后可能会让你更清楚。
首先 - 尽可能使用foreach循环遍历DataGridView
的行和单元集。它最终变得更清洁,更易于维护。例如,当您遍历所需的列时,您假设另一列从不将被添加。
下一步 - 尝试按名称而不是索引引用列。在维护代码时,它不那么脆弱。
您检查复选框是否选中是不正确的 - 如果用户选择该框,则取消您的方式,然后删除您仍然计算的复选框。您需要检查null,如果不是null,则检查是否为真。
通过这些更改,您可以使用以下内容:
foreach (DataGridViewRow r in dataGridView1.Rows)
{
if (r.Cells["CheckBox"].Value != null && (bool)r.Cells["CheckBox"].Value)
{
foreach (DataGridViewCell c in r.Cells)
{
if (c.ValueType == typeof(string))
{
// The code here is still ugly - there is almost certainly
// a better design for what you are trying to do but that is
// beyond the scope of the question.
// Plus it still has your original bug of referencing the
// same row of text boxes repeatedly.
TextBox theText1 = (TextBox)vobj.Controls[c.ColumnIndex];
theText1 += c.Value.ToString();
}
}
}
}