选中复选框后,无法从网格表中获取值?

时间:2015-05-18 14:50:08

标签: c# winforms datagridview datagridviewcheckboxcell

我想获取复选框所在行的值。我是C#windows表单的新手,到目前为止还不成功。我想最终使用这些行值,所以如果用户选择多行,那么我应该为那些检查获得值。另外,我已将选择模式设置为'fullrowselect'

请修改我的代码

private void button1_Click(object sender, EventArgs e)
{
    StringBuilder ln = new StringBuilder();
    dataGridView1.ClearSelection();
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (dataGridView1.SelectedRows.Count>0 )
        {                    
            ln.Append(row.Cells[1].Value.ToString());
        }
        else
        {
            MessageBox.Show("No row is selected!");
            break;                    
        }
    }
    MessageBox.Show("Row Content -" + ln);
}

3 个答案:

答案 0 :(得分:0)

SelectedRows是所选行(或高位行)的行数,而不是已检查的行数。 您的代码中的第二个问题是您正在执行foreach行,但在您内部使用dataGridView,而不是当前行。 这就是你的必须如何:

private void button1_Click(object sender, EventArgs e)
{
    const int checkBoxPosition = 3; //You must type here the position of checkbox.
                                    // Remember, it's zero based.

    StringBuilder ln = new StringBuilder();
    dataGridView1.ClearSelection();
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
      if (row.Cells[checkBoxPosition].Value == true)
        {                    
            ln.Append(row.Cells[1].Value.ToString());
        }
        else
        {
            MessageBox.Show("No row is selected!");
            break;                    
        }

    }
    MessageBox.Show("Row Content -" + ln);
}

答案 1 :(得分:0)

网格中有一个复选框列不会更改任何行的内部状态,因此您需要自己迭代它们以进行评估。虽然你需要为checkBoxColumnIndex中的复选框列提供正确的列索引

,但这应该可以解决问题。
int checkBoxColumnIndex = nnn; // 0 based index of checkboxcolumn
private void button1_Click(object sender, EventArgs e)
{
    List<string> checkedItems = new List<string>();

    dataGridView1.ClearSelection();
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        DataGridViewCheckBoxCell checkBox= row.Cells[checkBoxColumnIndex] as DataGridViewCheckBoxCell;

        if (Convert.ToBoolean(checkBox.Value) == true)
        {                    
             checkedItems.Add(row.Cells[1].Value.ToString());
        }
    }
    if (checkItems.Count > 0)
        MessageBox.Show("Row Content -\r\n" + String.Join("\r\n", checkedItems));
    else
        MessageBox.Show("No row is selected!");
}

不可否认,List<string>是一个繁重的构造,如果您只想打印列表,但如果您需要对所有选中的值进行进一步处理,那么它将非常有用。

答案 2 :(得分:0)

以下是您可能想要的代码版本。但是很难分辨,因为您正在讨论选定的行,但在处理行之前正在清除选择!

这没有任何意义..也许你的意思是选中的行?好的,你这样做,所以你走了:

  private void button1_Click(object sender, EventArgs e)
  {
      StringBuilder ln = new StringBuilder();
      dataGridView1.ClearSelection();
      foreach (DataGridViewRow row in dataGridView1.Rows)
      {
          if (((bool?)row.Cells[0].Value) == true)
          {
               ln.Append(row.Cells[1].FormattedValue);
          }
      }
      if (ln.Length <= 0) MessageBox.Show("No rows are checked!");
      else MessageBox.Show("Rows content: " + ln);
 }