按标签查找DataGridView项(行)

时间:2009-11-30 19:04:37

标签: c# winforms datagridview tags

嗨我有DataGridView控件,我手动填充项目(没有DataSource)

像那样

        int row = dgvClients.Rows.Add();
        dgvClients.Rows[row].Cells["ClientObjectID"].Value = somevalue1;
        dgvClients.Rows[row].Cells["ClientCode"].Value = somevalue2;
        dgvClients.Rows[row].Tag = SomeObject1;

请注意,gridview中的每一行代表一些对象,其标记设置为特定对象。只有一行可以对一个SomeObject具有Tag引用。没有重复。

现在我需要找到引用SomeObject的datagridview ROW。什么是最好的方式?

2 个答案:

答案 0 :(得分:3)

这是我放在一起可能会做你所描述的事情。它既快又脏,但它可能会让你前进:

我在表单上有一个空白的DataGridView,一个组合框和一个文本框。 TestObject是一个类,它是一个具有3个字符串属性的对象,用于测试此示例。

为了方便起见,我使用一些TestObject实例初始化一个通用列表。然后我手动向datagridview添加3列,这些列对应于TestObject的3个属性。然后我遍历列表并手动将它们添加到datagridview,以及实际将对象存储在Row的标记属性中。

然后我使用对datagridview中列的引用来填充组合框。用户将选择他/她想要搜索的列,然后在文本框中键入要匹配的文本。

然后我处理textbox textchanged事件,根据组合框中选择的列和文本框中的文本搜索datagridview。对于更大的数据集,您不希望处理textchanged事件,因为在每次更改字母后搜索都太慢。

不使用数据表或数据源,我想不出任何简单的方法来搜索行而不进行迭代。我不知道你的要求,但我会使用带有列表的bindingsource或至少设置一个数据表。使用绑定源,您还可以应用过滤器,并仅动态显示与您的搜索匹配的结果。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            List<TestObject> objects = new List<TestObject>
                {
                        new TestObject("1", "object1", "first"),
                        new TestObject("2", "object2", "nada"),
                        new TestObject("3", "object3", "Hello World!"),
                        new TestObject("4", "object4", "last")
                };

            dataGridView1.Columns.Add("ColID", "ID");
            dataGridView1.Columns.Add("ColName", "Name");
            dataGridView1.Columns.Add("ColInfo", "Info");

            foreach (TestObject testObject in objects)
            {
                int row = dataGridView1.Rows.Add();
                dataGridView1.Rows[row].Cells["ColID"].Value = testObject.ID;
                dataGridView1.Rows[row].Cells["ColName"].Value = testObject.Name;
                dataGridView1.Rows[row].Cells["ColInfo"].Value = testObject.Info;
                dataGridView1.Rows[row].Tag = testObject;
            }

            foreach (DataGridViewColumn col in dataGridView1.Columns)
            {
                comboBox1.Items.Add(col);
            }

            comboBox1.ValueMember = "HeaderText";
            comboBox1.SelectedIndex = 0;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            dataGridView1.ClearSelection();
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {

                if (row.Cells[((DataGridViewColumn)comboBox1.SelectedItem).Name].Value == null)
                {
                    continue;
                }
                if (row.Cells[((DataGridViewColumn)comboBox1.SelectedItem).Name].Value.ToString().Equals(
                        textBox1.Text,StringComparison.InvariantCultureIgnoreCase))
                {
                    row.Selected = true;
                    return;
                }
            }
        }
    }
}

public class TestObject
{
    public TestObject(string id, string name, string info)
    {
        ID = id;
        Name = name;
        Info = info;
    }

    public string ID { get; set; }
    public string Info { get; set; }
    public string Name { get; set; }
}

答案 1 :(得分:1)

您可以使用LINQ并将结果设置为datagridview数据源。这样,您需要做的就是运行LINQ,将其绑定到datagridview,然后刷新它。

在VB中,我会将其编码为:

dim results = from obj in objects _
              where obj.<property> = <value> _
              select obj

datagridview1.datasource = results.tolist()
datagridview1.refresh()

如果没有其他人提出更好的答案,我今晚将创建一个测试项目,为您提供实用的C#代码。

瓦德