c# - 按标签查找 DataGridView 项目(行)

标签 c# winforms datagridview tags

您好,我有 DataGridView 控件,其中填充了很多项目(没有数据源)

就这样

        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 中的每一行代表某个对象,其 Tag 设置为特定对象。只有一行可以有对一个 SomeObject 的 Tag 引用。没有重复。

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

最佳答案

这是我整理的一些东西,可能会实现您所描述的功能。它既快又脏,但它可能会让你继续前进:

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

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

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

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

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

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; }
}

关于c# - 按标签查找 DataGridView 项目(行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1821736/

相关文章:

c# - 大小和位置的通用名称?

c# - 如何格式化 MS Chart 控件中的 Axis

c# - SQL Server HASHBYTES 和扩展 Ascii

c# - 如何禁用选中列表框中的复选框?

c# - 异步编程实际上与同步编程总共花费相同的时间

c#-4.0 - 如何在 C# 中动态生成在 DataGridView 内选中的复选框?

C#在几个月内有所不同?

winforms - winform中的activex

从数据库到 DataGridView 的 C# 图像

vb.net - 滚动到 Datagridview 选定的行