从1 datagrid获取已检查行的数据到另一个datagrid,从其他datagrid中删除未经检查的行

时间:2014-07-25 07:34:03

标签: c# sql winforms visual-studio-2010 datagridview

我在WinForms中有2个datagridview dgv1 dgv2 dgv1有一些列,包括1个CheckBoxColumn,dgv2有一些列但没有CheckBoxColumn。 我想要的功能使我,当我检查CheckBoxColumn时,应选择该特定行的数据并进入Dgv2。 这是我如何将选定的行从dgv1放到dgv2。 但是如果我取消check(或unckeck),检查dgv1中的checkBox应该从dgv2中删除该特定行。 帮我解决这个问题。我会感谢你们,期待着这一点。 :)

这是我的代码  考虑datagridview6 = dgv1和datagridview10 = dgv2

private void dataGridView6_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    dataGridView10.Visible = true;           
         if (dataGridView6.CurrentCell.ColumnIndex == 7)
            {
                if (dataGridView6.CurrentCell.Value != null)
                {
                    bool checkstate = (bool)dataGridView6.CurrentCell.Value;

                    if (checkstate == false)
                    {
                        dataGridView6.CurrentCell.Value = true;                                           
                    }
                else
                 {//here help in logic to delete unchecked row
                    dataGridView6.CurrentCell.Value = false;
                     int j= int.Parse(dataGridView6.Rows[e.RowIndex].ToString());
                     dataGridView10.Rows.Remove(dataGridView10.Rows[j]);
                  }
               }
         else
         {dataGridView6.CurrentCell.Value = true;
           dataGridView10.Rows.Insert(i);          dataGridView10.Rows[i].Cells[1].Value=dataGridView6.CurrentRow.Cells[2].Value.ToString();
dataGridView10.Rows[i].Cells[2].Value = dataGridView6.CurrentRow.Cells[3].Value.ToString();
dataGridView10.Rows[i].Cells[3].Value = dataGridView6.CurrentRow.Cells[5].Value.ToString();
           }
     }
在dgv2中选择了此逻辑检查行中的

/ *,但在取消选中时,删除操作无效。

两个数据网格都不与数据库绑定,使用SQlCommand类获取值。

2 个答案:

答案 0 :(得分:1)

要执行此操作,您需要将RowIndex dgv2存储在Checked Row的Tag属性中。

例如,当您从dgv1选择任何行时,您要在dgv2 gridview中添加该记录。现在,您需要将创建的行的新行索引存储在dgv1.CurrentRow

因此,当单元格取消选中时,您可以使用该行索引从dgv2中找到添加的行。

///Inserting default records
///The fifth column value is a primary key value
///Application will check that value with second grid and performs remove and add rows
///we cannot use row index to remove row. because the row index will be changed if any row removed from dgv2.
///I have placed this code in form load event.
dgv1.Rows.Add(false, "Nimesh", "Gujarat", "India", 1);
dgv1.Rows.Add(false, "Prakash", "MP", "India", 2);
dgv1.Rows.Add(false, "Rohit", "Maharashtra", "India",  3);
dgv1.Rows.Add(false, "Jasbeer", "Panjab", "India",  4);
dgv1.Rows.Add(false, "Venkteshwar", "Karnatak", "India", 5);
dgv1.Rows.Add(false, "Rony", "Delhi", "India", 6);


///We cannot use CellChange event becauase it will be executed after cell end edit.
///We cannot use CellContentClick event coz it will not call when you double click or clicking quickly multiple times.
///So we are using CellMouseUp event 


private void dgv1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
    if (dgv1.CurrentCell == null)
        return;

    dgv2.Visible = true;
    if (dgv1.CurrentCell.ColumnIndex == 0)
    {
        bool bValue = (bool)dgv1.CurrentCell.GetEditedFormattedValue(e.RowIndex, DataGridViewDataErrorContexts.CurrentCellChange);
        if (bValue)
        {
            for (int iRow = 0; iRow < dgv2.Rows.Count; iRow++)
            {
                if (dgv2.Rows[iRow].Tag != null && dgv2.Rows[iRow].Tag.Equals(dgv1.CurrentRow.Cells[4].Value))
                    return;
            }
            int iNewRowIndex = dgv2.Rows.Add();
            dgv2.Rows[iNewRowIndex].Cells[0].Value = dgv1.CurrentRow.Cells[1].Value;
            dgv2.Rows[iNewRowIndex].Cells[1].Value = dgv1.CurrentRow.Cells[2].Value;
            dgv2.Rows[iNewRowIndex].Cells[2].Value = dgv1.CurrentRow.Cells[3].Value;
            dgv2.Rows[iNewRowIndex].Tag = dgv1.CurrentRow.Cells[4].Value;
        }
        else
        {
            if (dgv1.CurrentRow.Cells[4].Value != null)
            {
                for (int iRow = 0; iRow < dgv2.Rows.Count; iRow++)
                {
                    if (dgv2.Rows[iRow].Tag != null && dgv2.Rows[iRow].Tag.Equals(dgv1.CurrentRow.Cells[4].Value))
                    {
                        dgv2.Rows.RemoveAt(iRow);
                        break;
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

在两个DataGridView上添加隐藏列。 当用户选中checkboxcolumn为隐藏列分配一些唯一值时。 将行的所有单元格从第一个DataGridView复制到第二个。 当用户取消选中该复选框时,只需按隐藏列的值查找该行。 RemoveAt()行。