Share via


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;

        }

    }