0

我有一个数据网格视图,其中复选框列作为第一列。我们想要的是当用户检查行时,所有检查的行都应该转到另一个表单中的文本框。我写了以下内容来做到这一点。但问题是虽然检查了超过 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();
}
}

}

谁能告诉我我能做些什么来解决这个问题?

4

2 回答 2

0

而不是这个:

theText1.Text = dataGridView1.Rows[x].Cells[col].Value.ToString();

尝试:

theText1.AppendText(dataGridView1.Rows[x].Cells[col].Value.ToString());
于 2012-06-07T17:19:08.433 回答
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. 它最终变得更干净,更易于维护。例如,当您遍历所需的列时,您假定永远不会添加另一列。

下一步 - 尝试按名称而不是索引来引用列。维护代码时,它的脆弱性要小得多。

您检查复选框是否被选中是不正确的 - 如果用户选择该框然后删除您仍然计算它的检查,那么您拥有它的方式。您需要检查是否为空,如果不为空,则检查是否为真。

通过这些更改,您将获得如下内容:

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();
            }
        }
    }
}
于 2012-06-07T19:38:50.647 回答