1

使用ms visual studiocsharp .net4

这是我必须检查重复的代码

    public void CheckForDuplicate()
    {
        DataGridViewRowCollection coll = ParetoGrid.Rows;
        DataGridViewRowCollection colls = ParetoGrid.Rows;
        List<string> listParts = new List<string>();
        int count = 0;
        foreach (DataGridViewRow item in coll)//379
        {
            foreach (DataGridViewRow items in colls)//143641
            {
                if (items.Cells[5].Value == item.Cells[5].Value)  
                {
                    if (items.Cells[2].Value != item.Cells[2].Value)
                    {
                        listParts.Add(items.Cells["Keycode"].Value.ToString());
                        count++;
                        dupi = true;

                        //txtDupe.Text = items.Cells["Keycode"].Value.ToString();
                        //this.Refresh();
                    }
                }
            }
        }
        MyErrorGrid.DataSource = listParts;
    }

这是允许用户保存之前的检查

private void butSave_Click(object sender, EventArgs e)
    {
        CheckForDuplicate();
        if (dupi == true)
        {
            txtDupe.Clear();

            dupi = false;
        }
        else
        {
            SaveMyWorkI();
            dupi = false;
        }
    }

这是它正在查看的数据: 在此处输入图像描述

现在,我知道逻辑一定是有缺陷的,因为它无论如何都会保存。我基本上是在pareto1上的每个单元格中搜索,以查看用户是否进行了任何重复,如果是这样,它将不会保存,而是在另一个 datagridview 中显示零件编号等……嗯,这就是计划。

所以有人可以看看这个并告诉我

1)在我的逻辑中这是失败的地方,如果检查是正确的呢?

2)列表是否可以添加信息,如果是这样,简单绑定到数据网格视图是否足以显示结果?

3)如果这只是一种非常糟糕的搜索方式,有人可以提供反映我想要实现的目标的代码。

非常感谢您未来的评论。

更新:: 好的,感谢您的帮助,我的算法现在可以工作了,但我的最后一个问题是显示在帕累托列上重复的零件编号,而不是显示长度。

public void CheckForDuplicate()
    {
        DataGridViewRowCollection coll = ParetoGrid.Rows;
        DataGridViewRowCollection colls = ParetoGrid.Rows;
        List<string> listParts = new List<string>();
        int count = 0;
        foreach (DataGridViewRow item in coll)//379
        { 
            foreach (DataGridViewRow items in colls)//143641
            {
                count++;
                if ((items.Cells[5].Value != null))
                {
                    if ((items.Cells[5].Value != null) && (items.Cells[5].Value.Equals(item.Cells[5].Value)))
                    {
                        if ((items.Cells[2].Value != null) && !(items.Cells[2].Value.Equals(item.Cells[2].Value)))
                        {
                            listParts.Add(items.Cells["Keycode"].Value.ToString());

                            dupi = true;
                        }
                    }
                }
            }
        }
        MyErrorGrid.DataSource = listParts;
        var message = string.Join(Environment.NewLine, listParts);
        //MyErrorGrid.DataSource = message;
        MessageBox.Show(message);

    }

即使消息框正确显示结果?绑定到我的数据网格时我错过了什么吗?

4

3 回答 3

3

这是一个简单的示例,展示了如何在数据输入期间执行验证。您可以通过多种方式自定义错误的显示方式(包括某种自定义对话框来解决错误),这可能会为您提供更好的解决方案。

public partial class Form1 : Form
{
    BindingSource bs;
    DataTable dt;    public Form1()
    {
        InitializeComponent();

        BindingList<BindingClass> data = new BindingList<BindingClass>
            { 
                new BindingClass{ Name = "one" }, 
                new BindingClass { Name = "two"} 
            };

        dataGridView1.DataSource = data;
        dataGridView1.CellValidating += new DataGridViewCellValidatingEventHandler(dataGridView1_CellValidating);

    }

    void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.Index != e.RowIndex & !row.IsNewRow)
            {
                if (row.Cells[0].Value.ToString() == e.FormattedValue.ToString())
                {
                    dataGridView1.Rows[e.RowIndex].ErrorText =
                        "Duplicate value not allowed";                    

                    e.Cancel = true;
                    return;
                }
            }
        }
        dataGridView1.Rows[e.RowIndex].ErrorText = string.Empty;
    }

} 

    public class BindingClass
    {
        public string Name { get; set; }
    }

}

当然,这并不总是符合您对用户喜欢使用什么的要求,但我认为这可能有助于查看另一种选择。

于 2012-04-24T15:04:39.453 回答
1

您正在与==!=进行比较。

items.Cells[5].Value暴露一个对象。

在您的情况下,这很可能是基于引用相等性进行相等性检查,这可能不是您想要的。尝试使用类似的东西items.Cells[5].Value.Equals(item.Cells[5].Value)

还请考虑在可用的最简单抽象上解决此类问题。例如,如果您将网格绑定到对象集合,那么您可以针对该对象集合执行清理操作,而无需考虑您在其上固定的任何 UI。

您还可以考虑使用 LINQ 命名空间中的Distinct扩展方法并为其提供一个IEqualityComparer*以确保您使用 .NET Framework 中用于删除重复项的最有效代码。


*) IEqualityComparer是一种抽象,当您认为两个对象相等时,它允许您在一个地方定义。Distinct提供了一个重载,您可以在其中指定这样的比较器。

于 2012-04-24T09:16:02.893 回答
0

看看这是否适合你

 var dup = dataGridView1.Rows.Cast<DataGridViewRow>().Distinct().Where(g => g.Index != 0);

排除索引为 0 的行。它是标题行。

于 2012-04-24T09:22:43.087 回答