這是我放在一起,可能會做你所描述的東西。它是快速和骯髒的,但它可能會讓你去:
我有一個空白的DataGridView,一個組合框和一個窗體上的文本框。 TestObject是一個具有3個字符串屬性的對象,用於本示例的測試目的。
爲了方便起見,我用TestObject的幾個實例初始化一個通用列表。然後我手動添加3列到datagridview對應於TestObject的3個屬性。然後,我遍歷列表並手動將它們添加到datagridview,並將對象實際存儲在Row的標籤屬性中。
然後,我使用datagridview中列的引用來填充組合框。用戶將選擇他/她想要搜索的列,然後在文本框中鍵入要匹配的文本。
然後,我處理textbox 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; }
}
讓我澄清。我有一些表和用戶可以輸入文字來查找項目。我需要選擇包含所需文本的行。我想知道是否有一些「模式」。我不想直接迭代並檢查 – 2009-11-30 19:08:59
因此,可搜索的文本是在標記中,而不是在其他列中? – John 2009-11-30 19:11:47
標記是指具有某些屬性(字符串)的某些類 datagridview列代表所有這些屬性,而 行代表某些類的不同實例。用戶輸入 文本並說明它是哪個屬性(列)。我需要找到正確的行並選擇它。 – 2009-11-30 19:16:46