2015-05-18 83 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