检查是否将重复行添加到datagridview

时间:2013-02-08 05:27:16

标签: c# winforms datagridview duplicates

我在两个表单上都有两个表单Form1(DGV1)和Form2(DGV2)以及Datagridview控件。

在Form1上有一个指向Form2的按钮链接,用户可以在其中向Form1 datagridview(DGV1)添加行。在Form2 Datagridview中,第一列中有一个复选框,用户一次只能选择一行。 Form2上的两个按钮1)完成2)添加项目

当用户通过一个接一个地选择行来单击“添加项目”时,必须将行添加到Form1上的datagridview中,并且当单击“完成”按钮时,应显示表单1以及添加的所有行。

我使用以下代码实现了这一目标:

int inde x= objQM.gvItemDetails.Rows.Add(); 
DataGridViewRow row = (DataGridViewRow)objQM.gvItemDetails.Rows[index]; 
decimal UnitCos = Convert.ToDecimal(gvInventory.Rows[RowIndex].Cells[8].Value.ToString()); row[0] = false; 
row[1] = 1;
row[2] = gvInventory.Rows[RowIndex].Cells[6].Value.ToString();
row[3] = LoadSellQty();
row[4] = Convert.ToDecimal(gvInventory.Rows[RowIndex].Cells[8].Value.ToString());
row[5] = LoadSellQty() * UnitCost; 
row[7] = Convert.ToInt32(gvInventory.Rows[RowIndex].Cells[1].Value.ToString());

现在问题是验证在Form2上单击AddItems按钮时是否在Form1上的DGV1中添加了相同的行。我的意思是不必添加重复的行。

3 个答案:

答案 0 :(得分:2)

我相信您的DataGridView行中有一个唯一的名称,您可以使用linq

来实现此目的
bool IsExist = dataGridView1.Rows.Cast<DataGridViewRow>()
                                   .Count(c => !string.IsNullOrWhiteSpace(c.Cells[colIndex].EditedFormattedValue.ToString()) &&
                                   c.Cells[colIndex].EditedFormattedValue.ToString().Trim() == dgv[colIndex, rowIndex].EditedFormattedValue.ToString()) > 1;

if (IsExist)
{
   //do stuff
}

更新基于ItemID

bool IsExist = dataGridView1.Rows.Cast<DataGridViewRow>()
                      .Count(c => 
                      c.Cells[colIndexOfItemId]
                      .EditedFormattedValue.ToString() == ItemID) > 1; //or (int)c.Cells[colIndexOfItemId].Value

答案 1 :(得分:0)

我会尝试两种不同的方式,顺便说一下,顺便说一下,我更喜欢解决方案#2:

  1. 如果行数很小,只需自己写一个循环,只需逐个检查值,这会使代码看起来不那么好。

  2. 如果您正在使用DataSet或DataTable,请尝试在DataTable上添加一个UniqueConstraint,它实际上包含所有列,因此如果添加了重复行,它将抛出异常并且您知道它。有关详情,请查看here

答案 2 :(得分:0)

 private void dgViewOrderList_CellValidated(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0 && dgViewOrderList.CurrentCell.Value != null)
            {
                var cellValue = dgViewOrderList.CurrentCell.Value.ToString();
                var isExist = dgViewOrderList.Rows.Cast<DataGridViewRow>().Count(c =>c.Cells[0].EditedFormattedValue.ToString() == cellValue) > 1;
                if (isExist)
                {
                    dgViewOrderList.CurrentCell.Value = null;
                }
            }
        }
    }