2015-05-18 60 views
0

我想获得检查复选框的行的值。我是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); 
} 
+0

使用'dataGridView1.SelectedRows'在foreach循环中,如果((布尔),然后检查'checkboxCell.cbc.Value) – TaW

+0

TAW,那么你可以说整个代码在if循环中... – user3613720

+0

你想要所有检查行的列值还是第一个?这个循环正在提前退出。 – cdkMoose

回答

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>是一个沉重的结构,如果你想要做的是打印的清单,但它如果您需要对所有选中的值进行进一步处理,这将会很有用。

+0

这里有一些问题。我使用了ur代码,但是当我点击复选框并单击按钮时,它不会显示选中的行msg .. – user3613720

+0

您是否在正确的列索引中替换了nnn? – cdkMoose

+0

只是放在一个简单的网格来测试,它为我工作。请确认你有正确的索引。 – cdkMoose

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); 
} 
+0

这个逻辑停止后,没有复选框选中的第一行。这是期望的行为? – cdkMoose

+0

Richardo,我尝试了上面的代码,当我选择一行时,它从整个列中获取值。我想从选定的行中获取价值/ s。 CdkMoose,是或有更好的方法。 – user3613720

0

这是您的代码的一个版本,可能是你想要的..但​​很难说,因为你正在谈论选定的行,但在处理行之前清除选择!

这没有任何意义..也许你的意思是检查行? OK,你做的,所以在这里你去:

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); 
} 
+0

TaW,你怎么能让它从检查行中获取值?目前,如果您使用Ctrl +左键单击来检查并突出显示行,它会得到值。 – user3613720

+0

那么,那更容易.. – TaW

+0

感谢它的工作。 – user3613720