2017-03-10 6 views
0

datagridviewにはcheckboxの列があり、deleteの行にcheckeddeleteというボタンを付けたいと思います。ただし、チェックされたrowの代わりに、uncheckedであるrowsが削除されました。 私はレコードを削除するために使用されている各列の値を格納するためのリストオブジェクト(srv_NameList)、ボタンがクリックされると削除されますそのリストに保存する任意の値を得た:チェックボックスがチェックされている場合、DataGridビューでレコードを削除する方法

private void dataGrid_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
{ 
     if (dataGrid.Columns[e.ColumnIndex].Name.Equals("Select")) 
     { 
      if (dataGrid.Rows[e.RowIndex].Selected == true) 
      {      
        string srvName = dataGrid.Rows[e.RowIndex].Cells["ServiceName"].Value.ToString(); 

        srv_NameList.Add(srvName);      
      } 
      if (dataGrid.Rows[e.RowIndex].Selected == false) 
      { 
       string srvName_del = dataGrid.Rows[e.RowIndex].Cells["ServiceName"].Value.ToString(); 

       if (srv_NameList.Contains(srvName_del)) 
       { 
        srv_NameList.Remove(srvName_del); 
       } 
      } 
     } 
} 

できる人親切何が間違っているのか教えてください。

+0

DataGridViewの編集が終了していないとどこかのコードでは、あなたが行を削除しようとすると、この種の問題は通常起こります。行を削除する前に、DataGridViewの編集が完了していることを確認してください。 DataGridView.EndEdit()を強制的に呼び出すことができます。 – Bahrom

答えて

0

私はバインドされたデータを使用し、DataGridViewではなくデータで操作することをお勧めします。

例:

public partial class Form1 : Form 
{ 
    public class DtoObj 
    { 
     public string Field1 { get; set; } 
     public int Field2 { get; set; } 
     public bool IsSelected { get; set; } 
    } 

    private BindingList<DtoObj> gridValues; 

    public Form1() 
    { 
     InitializeComponent(); 
     gridValues = new BindingList<DtoObj>() { 
      new DtoObj() { Field1 = "#1", Field2 = 1 }, 
      new DtoObj() { Field1 = "#2", Field2 = 2 }, 
      new DtoObj() { Field1 = "#3", Field2 = 3 }, 
      new DtoObj() { Field1 = "#4", Field2 = 4 }, 
     }; 

     dataGridView1.DataSource = gridValues; 
    } 

    private void buttonDelete_Click(object sender, EventArgs e) 
    { 
     var objectsToRemove = gridValues.Where(o => o.IsSelected).ToList(); 
     foreach (var idx in objectsToRemove) 
      gridValues.Remove(idx); 
    } 
} 
関連する問題