Row specific filtering of DataGridViewComboBox data source.
I had a specific situation where I need to bind a combo box's data source in a grid view had to be filtered based on a value in the row. Here is how I have done the same. I have not assigned any datasource to DataGridViewComboBox column, instead I have assigned DataSource to each of the DataGridViewComboBoxCell. Hope this is right. :)
public partial class DemoGridView : Form
{
private
string[] names = new
string[] { "ABC",
"XYZ", "UVW"
};
public
DemoGridView()
{
InitializeComponent();
}
private
void Form1_Load(object
sender, EventArgs e)
{
DataSet
data = BuildDemoData();
AddColumns(data);
dataGridView1.DataSource =
data.Tables["DemoData"];
SetFilteredList(data,
dataGridView1);
}
private
void SetFilteredList(DataSet
data, DataGridView demoGrid)
{
DataViewManager
viewManager = new DataViewManager(data);
demoGrid.AllowUserToAddRows = false;
demoGrid.AllowUserToDeleteRows = false;
for
(int i = 0; i < demoGrid.Rows.Count; i++)
{
DataGridViewComboBoxCell
comboCell = demoGrid[3, i] as DataGridViewComboBoxCell;
DataView
cellView = viewManager.CreateDataView(data.Tables["Mod3Numbers"]);
cellView.RowFilter = "FilterID = " + demoGrid[0,
i].Value.ToString();
comboCell.DataSource =
cellView;
}
}
private
void AddColumns(DataSet
data)
{
DataGridViewTextBoxColumn
idCol = new DataGridViewTextBoxColumn();
idCol.HeaderText = "ID";
idCol.DataPropertyName = "ID";
idCol.Visible = false;
DataGridViewTextBoxColumn
nameCol = new DataGridViewTextBoxColumn();
nameCol.HeaderText = "Name";
nameCol.DataPropertyName = "Name";
DataGridViewComboBoxColumn
monthCol = new DataGridViewComboBoxColumn();
monthCol.DataSource = data.Tables["Months"];
monthCol.DisplayMember = "Name";
monthCol.ValueMember = "ID";
monthCol.DataPropertyName = "Month";
DataGridViewComboBoxColumn
fidCol = new DataGridViewComboBoxColumn();
//FIDCol.DataSource
= data.Tables["Mod3Numbers"].DefaultView;
fidCol.DisplayMember = "Name";
fidCol.ValueMember = "ID";
fidCol.DataPropertyName = "FID";
dataGridView1.Columns.Add(idCol);
dataGridView1.Columns.Add(nameCol);
dataGridView1.Columns.Add(monthCol);
dataGridView1.Columns.Add(fidCol);
}
private
DataSet BuildDemoData()
{
DataSet
data = new DataSet();
data.Tables.Add(GenerateListOfMonths());
data.Tables.Add(GetListMod3());
data.Tables.Add(GetMainList());
return
data;
}
private
DataTable GetMainList()
{
DataTable
demoTable = new DataTable("DemoData");
demoTable.Columns.Add("ID", typeof(int));
demoTable.Columns.Add("Name", typeof(string));
demoTable.Columns.Add("Month", typeof(int));
demoTable.Columns.Add("FID", typeof(int));
Random
rand = new Random(DateTime.Now.Millisecond % 100);
DataRow
demoRow;
for
(int i = 0; i < 3; i++)
{
demoRow = demoTable.NewRow();
demoRow[0] = i;
demoRow[1] = names[i];
demoRow[2] = rand.Next(1,12);
demoRow[3] = 3*rand.Next(1,6) +
i;
demoTable.Rows.Add(demoRow);
}
return
demoTable;
}
private
DataTable GetListMod3()
{
DataTable
mod3Table = new DataTable("Mod3Numbers");
mod3Table.Columns.Add("Name", typeof(string));
mod3Table.Columns.Add("ID", typeof(int));
mod3Table.Columns.Add("FilterID", typeof(int));
DataRow
mod3Number;
for
(int i = 1; i <= 20; i++)
{
mod3Number =
mod3Table.NewRow();
mod3Number[0] = i.ToString();;
mod3Number[1] = i;
mod3Number[2] = i % 3;
mod3Table.Rows.Add(mod3Number);
}
return
mod3Table;
}
private
DataTable GenerateListOfMonths()
{
DataTable
monthsTable = new DataTable("Months");
monthsTable.Columns.Add("Name", typeof(string));
monthsTable.Columns.Add("ID", typeof(int));
DataRow
month;
for
(int i = 1; i <= 12; i++)
{
month = monthsTable.NewRow();
month[0] = new DateTime(2000,
i, i).ToString("MMMM");
month[1] = i;
monthsTable.Rows.Add(month);
}
return
monthsTable;
}
}