Here is something I put together that might do what you are describing. It is quick and dirty, but it might get you going:
I have a blank DataGridView, a combobox, and a textbox on a form. TestObject is a class that is an object with 3 string properties for testing purposes of this example.
For ease, I initialize a generic list with a few instances of TestObject. I then manually add 3 columns to the datagridview which correspond to the 3 properties of TestObject. I then iterate through the list and manually add them to the datagridview, as well as actually storing the object in the Row's tag property as well.
I then fill the combobox with references to the columns in the datagridview. The user will select which column she/he wants to search for, then type the text to match in the textbox.
I then handle the textbox textchanged event to search the datagridview based on the column that is selected in the combobox and the text in the textbox. For a bigger dataset, you wouldn't want to handle the textchanged event because it would be too slow to search after every letter change.
Without using a datatable or datasource, I can't think of any easy way to search the rows without iterating. I don't know your requirements, but I would use a bindingsource with a list or set up a datatable at a minimum. With a bindingsource you could also apply a filter and dynamically show only those results that match your search.
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; }
}