嗨,我有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中的每一行代表一个对象,并且其Tag设置为特定对象。只有一行可以具有对一个SomeObject的Tag引用。无重复。
现在,我需要找到引用SomeObject的datagridview ROW。什么是最好的方法?
最佳答案
我整理的这些内容可能会满足您的描述。它既快速又肮脏,但可能会让您前进:
我在表单上有一个空白的DataGridView,一个组合框和一个文本框。 TestObject是一个类,是一个具有3个字符串属性的对象,用于测试本示例。
为简便起见,我用一些TestObject实例初始化一个通用列表。然后,我将3列手动添加到datagridview中,它们对应于TestObject的3个属性。然后,我遍历该列表并将其手动添加到datagridview中,以及将对象实际存储在Row的tag属性中。
然后,我用对datagridview中各列的引用填充组合框。用户将选择她/他要搜索的列,然后在文本框中键入要匹配的文本。
然后,我处理文本框textchanged事件,以根据组合框中选择的列和文本框中的文本搜索datagridview。对于更大的数据集,您将不希望处理textchanged事件,因为在每次更改字母后搜索速度太慢。
如果不使用数据表或数据源,就无法想到一种无需迭代即可搜索行的简便方法。我不知道您的要求,但是我会使用带有列表的绑定源或至少设置一个数据表。使用绑定源,您还可以应用过滤器,并动态地仅显示与搜索匹配的结果。
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/