need help!! cascading of combo box in grid view,the code below is working perfect but i want cascading combo boxes to get the value from sql table and do selection according to that not the value I've provided in filter by cell load event......help
in out in filter by cell load event to get the value directly from sql tables
regards
Osama aftab
public class ViewData
{
private int m_Region;
private int m_Territory;
public ViewData(int Region, int Territory)
{
m_Region = Region;
m_Territory = Territory;
}
public int RegionID
{
get { return m_Region; }
set { m_Region = value; }
}
public int TerritoryID
{
get { return m_Territory; }
set { m_Territory = value; }
}
}
// code in Form1.cs
public partial class Form1: Form
{
public List<ViewData> m_DataList;
DataSet RegionsTerritories = new DataSet();
DataTable regiontable = new DataTable("RegionTable");
DataTable territorytable = new DataTable("TerritoryTable");
BindingSource parentBS = new BindingSource();
BindingSource childBS = new BindingSource();
BindingSource filteredChildBS = new BindingSource();
public FilterByCell()
{
InitializeComponent();
this.Load += new EventHandler(FilterByCell_Load);
this.dataGridView1.CellValueChanged += new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
this.dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
this.dataGridView1.DataError += new DataGridViewDataErrorEventHandler(dataGridView1_DataError);
}
void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
if (e.ColumnIndex != territoryComboBoxColumn.Index)
{
MessageBox.Show("Data error occurs:" + e.Exception.Message);
}
}
void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (this.dataGridView1.CurrentCell.ColumnIndex == territoryComboBoxColumn.Index)
{
DataGridViewComboBoxEditingControl control = e.Control as DataGridViewComboBoxEditingControl;
BindingSource bs = control.DataSource as BindingSource;
if (bs != null)
{
// set the filteredChildBS as the DataSource of the editing control
(e.Control as ComboBox).DataSource = filteredChildBS;
object regionvalue = this.dataGridView1.Rows[this.dataGridView1.CurrentCell.RowIndex].Cells[regionComboBoxColumn.Index].Value;
if (regionvalue == DBNull.Value || regionvalue == null)
{
filteredChildBS.Filter = "RegionID=-1";
}
else
{
filteredChildBS.Filter = "RegionID=" + regionvalue.ToString();
}
// set the SelectedValue property of the editing control
if (this.dataGridView1.CurrentCell.Value != DBNull.Value && this.dataGridView1.CurrentCell.Value != null)
{
control.SelectedValue = this.dataGridView1.CurrentCell.Value;
}
}
}
}
void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == regionComboBoxColumn.Index)
{
// clear the cell value of the territory column in the same row
if (this.dataGridView1.DataSource.GetType() == typeof(DataTable))
{
this.dataGridView1.Rows[e.RowIndex].Cells[territoryComboBoxColumn.Index].Value = DBNull.Value;
}
else
{
this.dataGridView1.Rows[e.RowIndex].Cells[territoryComboBoxColumn.Index].Value = null;
}
}
}
void FilterByCell_Load(object sender, EventArgs e)
{
// add columns in the Region table
DataColumn col = new DataColumn("RegionID", typeof(int));
regiontable.Columns.Add(col);
col = new DataColumn("RegionDescription");
regiontable.Columns.Add(col);
// add columns in the Territory table
col = new DataColumn("TerritoryID", typeof(int));
territorytable.Columns.Add(col);
col = new DataColumn("TerritoryDescription");
territorytable.Columns.Add(col);
col = new DataColumn("RegionID", typeof(int));
territorytable.Columns.Add(col);
// add the two tables to the dataset
RegionsTerritories.Tables.Add(regiontable);
RegionsTerritories.Tables.Add(territorytable);
// add some rows in the region table
DataRow row = RegionsTerritories.Tables["RegionTable"].NewRow();
row[0] = 3;
row[1] = "region 3";
RegionsTerritories.Tables["RegionTable"].Rows.Add(row);
row = RegionsTerritories.Tables["RegionTable"].NewRow();
row[0] = 2;
row[1] = "region 2";
RegionsTerritories.Tables["RegionTable"].Rows.Add(row);
// add some rows in the Territory table
row = RegionsTerritories.Tables["TerritoryTable"].NewRow();
row[0] = 44122;
row[1] = "terri 44122";
row[2] = 3;
RegionsTerritories.Tables["TerritoryTable"].Rows.Add(row);
row = RegionsTerritories.Tables["TerritoryTable"].NewRow();
row[0] = 53404;
row[1] = "terri 53404";
row[2] = 3;
RegionsTerritories.Tables["TerritoryTable"].Rows.Add(row);
row = RegionsTerritories.Tables["TerritoryTable"].NewRow();
row[1] = "terri 60601";
row[2] = 2;
row[0] = 60601;
RegionsTerritories.Tables["TerritoryTable"].Rows.Add(row);
row = RegionsTerritories.Tables["TerritoryTable"].NewRow();
row[0] = 94105;
row[1] = "terri 94105";
row[2] = 2;
RegionsTerritories.Tables["TerritoryTable"].Rows.Add(row);
// set up ParentBS and ChildBS and filteredChildBS
parentBS.DataSource = RegionsTerritories;
parentBS.DataMember = "RegionTable";
childBS.DataSource = RegionsTerritories;
childBS.DataMember = "TerritoryTable";
filteredChildBS.DataSource = RegionsTerritories;
filteredChildBS.DataMember = "TerritoryTable";
// bind the regionComboBoxColumn to the parentBS
this.regionComboBoxColumn.DataSource = parentBS;
this.regionComboBoxColumn.DisplayMember = "RegionDescription";
this.regionComboBoxColumn.ValueMember = "RegionID";
// bind the territoryComboBoxColumn to the childBS
this.territoryComboBoxColumn.DataSource = childBS;
this.territoryComboBoxColumn.DisplayMember = "TerritoryDescription";
this.territoryComboBoxColumn.ValueMember = "TerritoryID";
// Bound to a datatable
DataTable dtViewData = new DataTable("ViewData");
dtViewData.Columns.Add("RegionID", typeof(Int32));
dtViewData.Columns.Add("TerritoryID", typeof(Int32));
DataRow dr = dtViewData.NewRow();
dr["RegionID"] = 3;
dr["TerritoryID"] = 44122;
dtViewData.Rows.Add(dr);
dr = dtViewData.NewRow();
dr["RegionID"] = 2;
dr["TerritoryID"] = 60601;
dtViewData.Rows.Add(dr);
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = dtViewData;
dataGridView1.Columns[0].DataPropertyName = "RegionID";
dataGridView1.Columns[1].DataPropertyName = "TerritoryID";
}
}