Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按标记查找DataGridView项(行)_C#_Winforms_Datagridview_Tags - Fatal编程技术网

C# 按标记查找DataGridView项(行)

C# 按标记查找DataGridView项(行),c#,winforms,datagridview,tags,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[ro

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


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

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

在VB中,我将其编码为:

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

datagridview1.datasource = results.tolist()
datagridview1.refresh()
dim results=来自对象中的obj_
其中obj=_
选择obj
datagridview1.datasource=results.tolist()
datagridview1.refresh()
如果没有其他人想出更好的答案,我今晚将创建一个测试项目,为您提供实用的C#代码


韦德

这里是我整理的一些东西,可能会像你所描述的那样。它又快又脏,但它可能会让你走:

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

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

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

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

如果不使用datatable或datasource,我想不出任何简单的方法来搜索行而不进行迭代。我不知道您的要求,但我会使用带有列表的bindingsource,或者至少设置一个datatable。使用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; }
}
使用系统;
使用System.Collections.Generic;
使用System.Windows.Forms;
命名空间Windows窗体应用程序2
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
列表对象=新列表
{
新的TestObject(“1”、“object1”、“first”),
新的TestObject(“2”、“object2”、“nada”),
新的TestObject(“3”,“object3”,“Hello World!”),
新的TestObject(“4”、“object4”、“last”)
};
dataGridView1.Columns.Add(“ColID”、“ID”);
dataGridView1.Columns.Add(“ColName”、“Name”);
dataGridView1.Columns.Add(“ColInfo”、“Info”);
foreach(对象中的TestObject TestObject)
{
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(dataGridView1.Columns中的DataGridViewColumn列)
{
comboBox1.Items.Add(col);
}
comboBox1.ValueMember=“HeaderText”;
comboBox1.SelectedIndex=0;
}
私有void textBox1\u TextChanged(对象发送方,事件参数e)
{
dataGridView1.ClearSelection();
foreach(dataGridView1.Rows中的DataGridViewRow行)
{
if(row.Cells[((DataGridViewColumn)comboBox1.SelectedItem.Name].Value==null)
{
继续;
}
如果(row.Cells[((DataGridViewColumn)comboBox1.SelectedItem).Name].Value.ToString().Equals(
textBox1.Text,StringComparison.InvariantCultureInogoreCase)
{
row.Selected=true;
返回;
}
}
}
}
}
公共类测试对象
{
公共测试对象(字符串id、字符串名称、字符串信息)
{
ID=ID;
名称=名称;
信息=信息;
}
公共字符串ID{get;set;}
公共字符串信息{get;set;}
公共字符串名称{get;set;}
}

让我澄清一下。我有一些表格,用户可以输入文本来查找项目。我需要选择包含所需文本的行。我想知道是否有某种“模式”。我不想直接进行迭代和检查,所以可搜索文本在标记中,而不在其他列中?标记是对具有某些属性(字符串)的某个类的引用。datagridview列表示所有这些属性,行表示某个类的不同实例。用户输入文本并说出它是哪个属性(列)。我需要找到正确的行并选择它。是的,LINQ只不过是扩展方法。看看这篇相关的帖子——如果你否决我的答案,并添加一条评论来解释原因,那就太好了。如果没有它,我将如何改进?我对这个答案的回答是+1,因为它为最新版本的.net提供了一个很好的解决方案。不知道-1来自哪里。。。