【问题标题】:Datagrid Remove duplicate rows while AddingDatagrid在添加时删除重复的行
【发布时间】:2016-08-04 08:06:17
【问题描述】:

您好,我想在输入 videoNo 时向 datagrid 添加一个值。到文本框并单击确定,这将显示:

这是输出

然后,当我再次添加相同的视频时,它将在数据网格中复制,如下所示:

如何避免这种重复? 这是我的添加代码

 private void button2_Click(object sender, EventArgs e)
    {
        listBox1.Visible = false;
        if (txt_vidNo.Text == "")
        {
            MessageBox.Show("Input Video Number", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

        }
        else
        {
            DialogResult dt = MessageBox.Show("Add Video?", "Continue", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (dt == DialogResult.Yes)
            {

                panel4.Visible = true;
                con = koneksyon.getConnect();
                con.Open();
                cmd = new SqlCommand("select * from Stock where videoNo ='" + txt_vidNo.Text + "'", con);
                dr = cmd.ExecuteReader();
                while (dr.Read())
                {

                    dataGridView1.Rows.Add(dr[0], dr[1], dr[2], dr[3], dr[4], dr[5], dr[6], dr[7], dr[8]);
                }
                txt_vidNo.Clear();
                btn_Rent.Visible = true;
                panelPay.Visible = true;
                cmd.Dispose();
                con.Close();
                dr.Dispose();
            }
            else
            {
                txt_vidNo.Clear();
            }

        }
    }

我想要的是当我输入相同的值时它不会在 Datagrid 中重复,我该怎么做?

【问题讨论】:

  • 您的数据库中是否也有重复的视频条目?您的 Datarow 中的任何值对于记录来说是唯一的吗?
  • @BojanB - 不,先生,我的目录号。是独一无二的,因为我将它设置为 PrimaryKey

标签: c# mysql datagridview datagrid


【解决方案1】:

您只需检查您的唯一键的值是否已经在数据网格中。

您可以使用 LINQ 执行此操作,如果 Column Catalog Number 中的值与读取的 Catalog 编号匹配,则检查所有具有非空值的行。

while (dr.Read())
{
   if (dataGridView1.Rows.Cast<DataGridViewRow>().Where(row => row.Cells[0].Value != null).All(row => (int) row.Cells[0].Value != dr[0]))
      dataGridView1.Rows.Add(dr[0], dr[1], dr[2], dr[3], dr[4], dr[5], dr[6], dr[7], dr[8]);
}

【讨论】:

    【解决方案2】:

    将while(dr.Read())改为if(dr.Read())

    while (dr.Read())
    {
      dataGridView1.Rows.Add(dr[0], dr[1], dr[2], dr[3], dr[4], dr[5], dr[6], dr[7], dr[8]);
    }
    

    【讨论】:

      【解决方案3】:

      我从 cmets 了解到,您只是想防止重复行,在您的情况下,DB 没有重复,它是返回相同记录的用户搜索,所以您有两个选择。

      1. 如果这些视频编号已获取且在网格中可用,则不要查询这些编号。
      2. 如下例所示,您可以防止重复。

      .

      while (dr.Read())
      {
          if(!dataGridView1.Rows.Cast<DataGridViewRow>().Any(x=>x.Cells[0].Value == dr.GetInt32(0)))  // or "GetString(0)" if it istring
          {
               dataGridView1.Rows.Add(dr[0], dr[1], dr[2], dr[3], dr[4], dr[5], dr[6], dr[7], dr[8]);
          }
      }
      

      【讨论】:

      • 哎呀..这是错字。应该是x=&gt;x.Cells[0].Value == dr.GetInt32(0)
      • 这是一个Linq语句,如果你不熟悉Linq替换为foreach循环。
      猜你喜欢
      • 2016-08-20
      • 2011-01-23
      • 2019-06-23
      • 1970-01-01
      • 2012-09-19
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多