在运行时添加combobx并在更改第一个的选定值时填充另一个组合框 [英] Add combobx in run time and fill another combobox when selected value of first one is changed

查看:59
本文介绍了在运行时添加combobx并在更改第一个的选定值时填充另一个组合框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我有一个绑定到datatable(dtDataCSV)的datagridview.此数据表填充了excel文件中的值,该文件只有5 col-Date,Bank Desc,Dr,Cr,Bal. dtDataCSV有7列.我在datagridview的第5列插入了第一个组合框.现在,如果我选择说第一个组合框的第三项...那么它应该添加另一个组合框并填充相应的项.

我该怎么办?
以下是我的代码

<br />
<pre>private void txtSheet_Leave(object sender, EventArgs e)<br />
        {<br />
            try<br />
            {<br />
                if (string.IsNullOrEmpty(txtFileName.Text))<br />
                {<br />
                    MessageBox.Show("Please select file first");<br />
                    return;<br />
                }<br />
                if (string.IsNullOrEmpty(txtSheet.Text))<br />
                {<br />
                    MessageBox.Show("Please write the exact sheet name of excel file");<br />
                    return;<br />
                }<br />
<br />
                dtDataCSV = new DataTable();<br />
                DataRow dr;<br />
                dtDataCSV.Columns.Add("TranRefNo", typeof(int));<br />
                dtDataCSV.Columns.Add("Date", typeof(DateTime));<br />
                dtDataCSV.Columns.Add("Bank Desc/Supplier Name", typeof(string));<br />
                dtDataCSV.Columns.Add("Account Code", typeof(string));<br />
                dtDataCSV.Columns.Add("Debit", typeof(double));<br />
                dtDataCSV.Columns.Add("Credit", typeof(double));<br />
                if (comboBox1.Text == "Bank Account")<br />
                {<br />
                    dtDataCSV.Columns.Add("Balance", typeof(string));<br />
                }<br />
                <br />
<br />
             <br />
<br />
                filHandCSV = new clsFileHandler(txtFileName.Text);<br />
<br />
                if (filHandCSV.FileInf.Exists)<br />
                {<br />
                    var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", filHandCSV.FileInf);<br />
                    OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [" + txtSheet.Text.Trim().ToString() + "$]", connectionString);<br />
                    DataSet ds = new DataSet();<br />
                    adapter.Fill(ds, "dtref");<br />
                    DataTable dttable = ds.Tables["dtref"];<br />
<br />
                    //Load CSV file to dtDataCSV<br />
                    int TranRefNo = 1;<br />
                    if (dttable.Rows.Count > 0)<br />
                    {<br />
                       <br />
                            foreach (DataRow dr1 in dttable.Rows)<br />
                            {<br />
                                // if (dr1[1].ToString() != "" && dr1[2].ToString() != "")<br />
                                if (dr1[1].ToString() != "")<br />
                                {<br />
                                    dr = dtDataCSV.NewRow();<br />
                                    dr["TranRefNo"] = TranRefNo;<br />
                                    dr["Date"] = Convert.ToDateTime(dr1[0].ToString()).ToString("dd MMM yyyy");<br />
                                    dr["Bank Desc/Supplier Name"] = dr1[1];<br />
                                    dr["Debit"] = dr1[2];<br />
                                    dr["Credit"] = dr1[3];<br />
                                    dr["Balance"] = dr1[4];<br />
                                    TranRefNo = TranRefNo + 1;<br />
                                    dtDataCSV.Rows.Add(dr);<br />
                                }<br />
                            }<br />
                        <br />
                        <br />
                    }<br />
<br />
<br />
                    TranRefNo = 1;<br />
                 <br />
<br />
                    dgvLoadExp.DataSource = dtDataCSV;<br />
                    //Formats the date column<br />
                    dgvLoadExp.Columns[1].DefaultCellStyle.Format = "dd-MMM-yyyy";<br />
<br />
                    // Add a new Column (Account Head) <br />
                    DataGridViewComboBoxColumn colAccHead = new DataGridViewComboBoxColumn();<br />
                    Expenses objAccHead = new Expenses();<br />
                    <br />
                    DataTable dt = new DataTable();<br />
                    dt.Columns.Add("catid", typeof(int));<br />
                    dt.Columns.Add("Account Head", typeof(string));<br />
                    dr = dt.NewRow();<br />
                    dr["catid"] = -1;<br />
                    dr["Account Head"] = "";<br />
                    dt.Rows.Add(dr);<br />
                    dt.Merge(objAccHead.getAccountHead());<br />
                    <br />
                    colAccHead.DataSource = dt;<br />
                    colAccHead.HeaderText = "Account Head";<br />
                    colAccHead.DisplayMember = "Account Head";<br />
                    colAccHead.ValueMember = "catid";<br />
                    this.dgvLoadExp.Columns.Insert(4, colAccHead);<br />
                    <br />
                    //Use DataPropertyName to get the selected key column as in :- <br />
                    this.dgvLoadExp.Columns[4].DataPropertyName = "catid";<br />
                  <br />
                }<br />
<br />
            }<br />
            catch (Exception ex)<br />
            {<br />
<br />
            }<br />
        }<br />
<br />
        private void dgvLoadExp_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)<br />
        {<br />
            if (dgvLoadExp.CurrentCell.ColumnIndex == 4)<br />
            {<br />
                ComboBox cmb = e.Control as ComboBox;<br />
                cmb.SelectedValueChanged += new EventHandler(cmb_SelectedValueChanged);<br />
            }<br />
        }<br />
<br />
        void cmb_SelectedValueChanged(object sender, EventArgs e)<br />
        {<br />
            DataGridViewComboBoxColumn colSubAccHead = new DataGridViewComboBoxColumn();<br />
<br />
            Expenses objSubAccHead = new Expenses();<br />
            colSubAccHead.DataSource = objSubAccHead.getSubAccountHead(((ComboBox)sender).SelectedValue.ToString());//Error at this line<br />
            colSubAccHead.HeaderText = "Sub Account Head";<br />
            colSubAccHead.DisplayMember = "SubHead";<br />
            colSubAccHead.ValueMember = "id";<br />
            this.dgvLoadExp.Columns.Insert(5, colSubAccHead);<br />
           <br />
        }</pre><br />


objSubAccHead.getSubAccountHead()返回一个数据表,其AccountHead id为选定值,即catid

任何帮助将不胜感激.
谢谢

解决方案

,connectionString);< br/> DataSet ds = new DataSet();< br/> adapter.Fill(ds,"dtref");< br/> DataTable dttable = ds.Tables ["dtref"];< br/> < br/> //将CSV文件加载到dtDataCSV< br/> int TranRefNo = 1;< br/> 如果(dttable.Rows.Count> 0)< br/> {< br/> < br/> foreach(dttable.Rows中的DataRow dr1)< br/> {< br/> //if(dr1 [1] .ToString()!="&& dr1 [2] .ToString()!=")< br/> if(dr1 [1] .ToString()!=")< br/> {< br/> dr = dtDataCSV.NewRow();< br/> dr ["TranRefNo"] = TranRefNo;< br/> dr ["Date"] = Convert.ToDateTime(dr1 [0] .ToString()).ToString("dd MMM yyyy");< br/> dr ["Bank Desc/Supplier Name"] = dr1 [1];< br/> dr ["Debit"] = dr1 [2];< br/> dr ["Credit"] = dr1 [3];< br/> dr ["Balance"] = dr1 [4];< br/> TranRefNo = TranRefNo +1;< br/> dtDataCSV.Rows.Add(dr);< br/> }< br/> }< br/> < br/> < br/> }< br/> < br/> < br/> TranRefNo = 1;< br/> < br/> < br/> dgvLoadExp.DataSource = dtDataCSV;< br/> //格式化日期列< br/> dgvLoadExp.Columns [1] .DefaultCellStyle.Format ="dd-MMM-yyyy";< br/> < br/> //添加新列(帐户标题)< br/> DataGridViewComboBoxColumn colAccHead =新的DataGridViewComboBoxColumn();< br/> 费用objAccHead = new Expenses();< br/> < br/> DataTable dt = new DataTable();< br/> dt.Columns.Add("catid",typeof(int));< br/> dt.Columns.Add("Account Head",typeof(string));< br/> dr = dt.NewRow();< br/> dr ["catid"] = -1;< br/> dr ["Account Head"] =";< br/> dt.Rows.Add(dr);< br/> dt.Merge(objAccHead.getAccountHead());< br/> < br/> colAccHead.DataSource = dt;< br/> colAccHead.HeaderText =帐户头";< br/> colAccHead.DisplayMember =帐户头";< br/> colAccHead.ValueMember ="catid";< br/> this.dgvLoadExp.Columns.Insert(4,colAccHead);< br/> < br/> //使用DataPropertyName来获取选定的键列,如:-< br/> this.dgvLoadExp.Columns [4] .DataPropertyName ="catid";< br/> < br/> }< br/> < br/> }< br/> catch(ex ex例外)< br/> {< br/> < br/> }< br/> }< br/> < br/> 私有void dgvLoadExp_EditingControlShowing(对象发送者,DataGridViewEditingControlShowingEventArgs e)< br/> {< br/> 如果(dgvLoadExp.CurrentCell.ColumnIndex == 4)< br/> {< br/> ComboBox cmb = e.Control as ComboBox;< br/> cmb.SelectedValueChanged + =新的EventHandler(cmb_SelectedValueChanged);< br/> }< br/> }< br/> < br/> void cmb_SelectedValueChanged(对象发送者,EventArgs e)< br/> {< br/> DataGridViewComboBoxColumn colSubAccHead =新的DataGridViewComboBoxColumn();< br/> < br/> 费用objSubAccHead = new Expenses();< br/> colSubAccHead.DataSource = objSubAccHead.getSubAccountHead((((ComboBox)sender).SelectedValue.ToString());//此行错误< br/> colSubAccHead.HeaderText =子帐户头";< br/> colSubAccHead.DisplayMember ="SubHead";< br/> colSubAccHead.ValueMember ="id";< br/> this.dgvLoadExp.Columns.Insert(5,colSubAccHead);< br/> < br/> }</pre>< br/>


objSubAccHead.getSubAccountHead()返回一个数据表,其AccountHead id为选定值,即catid

任何帮助将不胜感激.
谢谢


您好
在其selectedvaluechanged事件中的第一个组合框旁边添加第二个组合框...连续添加组合框.但是我只需要两个组合框.所以我所做的就是在txtsheet_Leave事件中添加了第二个组合框.

这是代码.

 DataGridViewComboBoxColumn colSubAccHead =  DataGridViewComboBoxColumn();
私有 无效 txtSheet_Leave(对象发​​件人,EventArgs e)
{
 ......

                     dgvLoadExp.DataSource = dtDataCSV;
                    // 设置日期列的格式
                    dgvLoadExp.Columns [ 1 ].DefaultCellStyle.Format = " ;
 
                    // 添加新列(客户头)
                    DataGridViewComboBoxColumn colAccHead =  DataGridViewComboBoxColumn();
                    费用objAccHead =  Expenses();
                    
                    DataTable dt =  DataTable();
                    dt.Columns.Add("  typeof ( int ));
                    dt.Columns.Add("  typeof (字符串));
                    dr = dt.NewRow();
                    dr [" ] = -1;
                    dr [" ] = " ";
                    dt.Rows.Add(dr);
                    dt.Merge(objAccHead.getAccountHead());
                    
                    colAccHead.DataSource = dt;
                    colAccHead.HeaderText = " ;
                    colAccHead.DisplayMember = " ;
                    colAccHead.ValueMember = " ;
                     .dgvLoadExp.Columns.Insert( 4 ,colAccHead);
                    
                  
// 使用DataPropertyName来获取选定的键列,如:-
                     .dgvLoadExp.Columns [ 4 ].DataPropertyName = " 猫";
                    
// 在此处添加了第二个组合框
                    colSubAccHead =  DataGridViewComboBoxColumn();
                    colSubAccHead .HeaderText = " ;
                    colSubAccHead .DisplayMember = " ;
                    colSubAccHead .ValueMember = " ;
                     .dgvLoadExp.Columns.Insert( 5 ,colSubAccHead);
                     .dgvLoadExp.Columns [ 5 ].DataPropertyName = "  id";

}
  私有 无效 dgvLoadExp_EditingControlShowing(对象发​​件人,DataGridViewEditingControlShowingEventArgs e)
        {
            如果(dgvLoadExp.CurrentCell.ColumnIndex ==  4 )
            {
                ComboBox cmb = e.Control  as  ComboBox;
                cmb.SelectedValueChanged + =  EventHandler(cmb_SelectedValueChanged);
            }
        }
无效 cmb_SelectedValueChanged(对象发​​送者,EventArgs e)
        {
            Combobox cmb =(组合框)发送器;
            如果(cmb.SelectedValue == <)>返回;
            费用objSubAccHead =  Expenses();
            colSubAccHead.DataSource = objSubAccHead.getSubAccountHead(cmb.SelectedValue.ToString());
           
           
        } 



它显示正确的值.
但是,如果用户选择了两个组合框,然后更改了第一个组合框,则第二个组合框不再有效.
然后显示错误:
System.ArgumentException:DataGridViewComboBoxCell值无效
要替换此默认对话框,请处理DataError事件.

我应该怎么办?任何帮助将不胜感激.
谢谢





您也可以尝试 http://www.asp.net/ajaxlibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx [ ^ ]

Hi,

I have a datagridview which is bound to the datatable(dtDataCSV). This datatable is filled with values from the excel file which has only 5 col-Date,Bank Desc,Dr,Cr,Bal . dtDataCSV has 7 columns. I have inserted a first combobox at column 5 in datagridview. Now if i select-say third item of the first combobox...then it should add another combobox and fill the corresponding items.

How do i do that?
Below is my code

<br />
<pre>private void txtSheet_Leave(object sender, EventArgs e)<br />
        {<br />
            try<br />
            {<br />
                if (string.IsNullOrEmpty(txtFileName.Text))<br />
                {<br />
                    MessageBox.Show("Please select file first");<br />
                    return;<br />
                }<br />
                if (string.IsNullOrEmpty(txtSheet.Text))<br />
                {<br />
                    MessageBox.Show("Please write the exact sheet name of excel file");<br />
                    return;<br />
                }<br />
<br />
                dtDataCSV = new DataTable();<br />
                DataRow dr;<br />
                dtDataCSV.Columns.Add("TranRefNo", typeof(int));<br />
                dtDataCSV.Columns.Add("Date", typeof(DateTime));<br />
                dtDataCSV.Columns.Add("Bank Desc/Supplier Name", typeof(string));<br />
                dtDataCSV.Columns.Add("Account Code", typeof(string));<br />
                dtDataCSV.Columns.Add("Debit", typeof(double));<br />
                dtDataCSV.Columns.Add("Credit", typeof(double));<br />
                if (comboBox1.Text == "Bank Account")<br />
                {<br />
                    dtDataCSV.Columns.Add("Balance", typeof(string));<br />
                }<br />
                <br />
<br />
             <br />
<br />
                filHandCSV = new clsFileHandler(txtFileName.Text);<br />
<br />
                if (filHandCSV.FileInf.Exists)<br />
                {<br />
                    var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", filHandCSV.FileInf);<br />
                    OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [" + txtSheet.Text.Trim().ToString() + "$]", connectionString);<br />
                    DataSet ds = new DataSet();<br />
                    adapter.Fill(ds, "dtref");<br />
                    DataTable dttable = ds.Tables["dtref"];<br />
<br />
                    //Load CSV file to dtDataCSV<br />
                    int TranRefNo = 1;<br />
                    if (dttable.Rows.Count > 0)<br />
                    {<br />
                       <br />
                            foreach (DataRow dr1 in dttable.Rows)<br />
                            {<br />
                                // if (dr1[1].ToString() != "" && dr1[2].ToString() != "")<br />
                                if (dr1[1].ToString() != "")<br />
                                {<br />
                                    dr = dtDataCSV.NewRow();<br />
                                    dr["TranRefNo"] = TranRefNo;<br />
                                    dr["Date"] = Convert.ToDateTime(dr1[0].ToString()).ToString("dd MMM yyyy");<br />
                                    dr["Bank Desc/Supplier Name"] = dr1[1];<br />
                                    dr["Debit"] = dr1[2];<br />
                                    dr["Credit"] = dr1[3];<br />
                                    dr["Balance"] = dr1[4];<br />
                                    TranRefNo = TranRefNo + 1;<br />
                                    dtDataCSV.Rows.Add(dr);<br />
                                }<br />
                            }<br />
                        <br />
                        <br />
                    }<br />
<br />
<br />
                    TranRefNo = 1;<br />
                 <br />
<br />
                    dgvLoadExp.DataSource = dtDataCSV;<br />
                    //Formats the date column<br />
                    dgvLoadExp.Columns[1].DefaultCellStyle.Format = "dd-MMM-yyyy";<br />
<br />
                    // Add a new Column (Account Head) <br />
                    DataGridViewComboBoxColumn colAccHead = new DataGridViewComboBoxColumn();<br />
                    Expenses objAccHead = new Expenses();<br />
                    <br />
                    DataTable dt = new DataTable();<br />
                    dt.Columns.Add("catid", typeof(int));<br />
                    dt.Columns.Add("Account Head", typeof(string));<br />
                    dr = dt.NewRow();<br />
                    dr["catid"] = -1;<br />
                    dr["Account Head"] = "";<br />
                    dt.Rows.Add(dr);<br />
                    dt.Merge(objAccHead.getAccountHead());<br />
                    <br />
                    colAccHead.DataSource = dt;<br />
                    colAccHead.HeaderText = "Account Head";<br />
                    colAccHead.DisplayMember = "Account Head";<br />
                    colAccHead.ValueMember = "catid";<br />
                    this.dgvLoadExp.Columns.Insert(4, colAccHead);<br />
                    <br />
                    //Use DataPropertyName to get the selected key column as in :- <br />
                    this.dgvLoadExp.Columns[4].DataPropertyName = "catid";<br />
                  <br />
                }<br />
<br />
            }<br />
            catch (Exception ex)<br />
            {<br />
<br />
            }<br />
        }<br />
<br />
        private void dgvLoadExp_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)<br />
        {<br />
            if (dgvLoadExp.CurrentCell.ColumnIndex == 4)<br />
            {<br />
                ComboBox cmb = e.Control as ComboBox;<br />
                cmb.SelectedValueChanged += new EventHandler(cmb_SelectedValueChanged);<br />
            }<br />
        }<br />
<br />
        void cmb_SelectedValueChanged(object sender, EventArgs e)<br />
        {<br />
            DataGridViewComboBoxColumn colSubAccHead = new DataGridViewComboBoxColumn();<br />
<br />
            Expenses objSubAccHead = new Expenses();<br />
            colSubAccHead.DataSource = objSubAccHead.getSubAccountHead(((ComboBox)sender).SelectedValue.ToString());//Error at this line<br />
            colSubAccHead.HeaderText = "Sub Account Head";<br />
            colSubAccHead.DisplayMember = "SubHead";<br />
            colSubAccHead.ValueMember = "id";<br />
            this.dgvLoadExp.Columns.Insert(5, colSubAccHead);<br />
           <br />
        }</pre><br />


objSubAccHead.getSubAccountHead() returns a datatable whose AccountHead id is selected value,i.e catid

Any help would be really appreciated.
Thanks

解决方案

", connectionString);<br /> DataSet ds = new DataSet();<br /> adapter.Fill(ds, "dtref");<br /> DataTable dttable = ds.Tables["dtref"];<br /> <br /> //Load CSV file to dtDataCSV<br /> int TranRefNo = 1;<br /> if (dttable.Rows.Count > 0)<br /> {<br /> <br /> foreach (DataRow dr1 in dttable.Rows)<br /> {<br /> // if (dr1[1].ToString() != "" && dr1[2].ToString() != "")<br /> if (dr1[1].ToString() != "")<br /> {<br /> dr = dtDataCSV.NewRow();<br /> dr["TranRefNo"] = TranRefNo;<br /> dr["Date"] = Convert.ToDateTime(dr1[0].ToString()).ToString("dd MMM yyyy");<br /> dr["Bank Desc/Supplier Name"] = dr1[1];<br /> dr["Debit"] = dr1[2];<br /> dr["Credit"] = dr1[3];<br /> dr["Balance"] = dr1[4];<br /> TranRefNo = TranRefNo + 1;<br /> dtDataCSV.Rows.Add(dr);<br /> }<br /> }<br /> <br /> <br /> }<br /> <br /> <br /> TranRefNo = 1;<br /> <br /> <br /> dgvLoadExp.DataSource = dtDataCSV;<br /> //Formats the date column<br /> dgvLoadExp.Columns[1].DefaultCellStyle.Format = "dd-MMM-yyyy";<br /> <br /> // Add a new Column (Account Head) <br /> DataGridViewComboBoxColumn colAccHead = new DataGridViewComboBoxColumn();<br /> Expenses objAccHead = new Expenses();<br /> <br /> DataTable dt = new DataTable();<br /> dt.Columns.Add("catid", typeof(int));<br /> dt.Columns.Add("Account Head", typeof(string));<br /> dr = dt.NewRow();<br /> dr["catid"] = -1;<br /> dr["Account Head"] = "";<br /> dt.Rows.Add(dr);<br /> dt.Merge(objAccHead.getAccountHead());<br /> <br /> colAccHead.DataSource = dt;<br /> colAccHead.HeaderText = "Account Head";<br /> colAccHead.DisplayMember = "Account Head";<br /> colAccHead.ValueMember = "catid";<br /> this.dgvLoadExp.Columns.Insert(4, colAccHead);<br /> <br /> //Use DataPropertyName to get the selected key column as in :- <br /> this.dgvLoadExp.Columns[4].DataPropertyName = "catid";<br /> <br /> }<br /> <br /> }<br /> catch (Exception ex)<br /> {<br /> <br /> }<br /> }<br /> <br /> private void dgvLoadExp_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)<br /> {<br /> if (dgvLoadExp.CurrentCell.ColumnIndex == 4)<br /> {<br /> ComboBox cmb = e.Control as ComboBox;<br /> cmb.SelectedValueChanged += new EventHandler(cmb_SelectedValueChanged);<br /> }<br /> }<br /> <br /> void cmb_SelectedValueChanged(object sender, EventArgs e)<br /> {<br /> DataGridViewComboBoxColumn colSubAccHead = new DataGridViewComboBoxColumn();<br /> <br /> Expenses objSubAccHead = new Expenses();<br /> colSubAccHead.DataSource = objSubAccHead.getSubAccountHead(((ComboBox)sender).SelectedValue.ToString());//Error at this line<br /> colSubAccHead.HeaderText = "Sub Account Head";<br /> colSubAccHead.DisplayMember = "SubHead";<br /> colSubAccHead.ValueMember = "id";<br /> this.dgvLoadExp.Columns.Insert(5, colSubAccHead);<br /> <br /> }</pre><br />


objSubAccHead.getSubAccountHead() returns a datatable whose AccountHead id is selected value,i.e catid

Any help would be really appreciated.
Thanks


Hi
Adding second combobox next to first combobox in its selectedvaluechanged event ...continuously adds comboboxes. But i need only two comboboxes.So what i have done is added second combobox in txtsheet_Leave event.

Here is the code.

DataGridViewComboBoxColumn colSubAccHead = new DataGridViewComboBoxColumn();
private void txtSheet_Leave(object sender, EventArgs e)
{
 ......

                     dgvLoadExp.DataSource = dtDataCSV;
                    //Formats the date column
                    dgvLoadExp.Columns[1].DefaultCellStyle.Format = "dd-MMM-yyyy";
 
                    // Add a new Column (Account Head) 
                    DataGridViewComboBoxColumn colAccHead = new DataGridViewComboBoxColumn();
                    Expenses objAccHead = new Expenses();
                    
                    DataTable dt = new DataTable();
                    dt.Columns.Add("catid", typeof(int));
                    dt.Columns.Add("Account Head", typeof(string));
                    dr = dt.NewRow();
                    dr["catid"] = -1;
                    dr["Account Head"] = "";
                    dt.Rows.Add(dr);
                    dt.Merge(objAccHead.getAccountHead());
                    
                    colAccHead.DataSource = dt;
                    colAccHead.HeaderText = "Account Head";
                    colAccHead.DisplayMember = "Account Head";
                    colAccHead.ValueMember = "catid";
                    this.dgvLoadExp.Columns.Insert(4, colAccHead);
                    
                  
//Use DataPropertyName to get the selected key column as in :- 
                    this.dgvLoadExp.Columns[4].DataPropertyName = "catid";
                    
//Added second combobox here
                    colSubAccHead = new DataGridViewComboBoxColumn();
                    colSubAccHead .HeaderText = "Sub Account Head";
                    colSubAccHead .DisplayMember = "SubHead";
                    colSubAccHead .ValueMember = "id";
                    this.dgvLoadExp.Columns.Insert(5, colSubAccHead);
                    this.dgvLoadExp.Columns[5].DataPropertyName = "id";

}
  private void dgvLoadExp_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            if (dgvLoadExp.CurrentCell.ColumnIndex == 4)
            {
                ComboBox cmb = e.Control as ComboBox;
                cmb.SelectedValueChanged += new EventHandler(cmb_SelectedValueChanged);
            }
        }
void cmb_SelectedValueChanged(object sender, EventArgs e)
        {
            Combobox cmb=(ComboBox)sender;
            if(cmb.SelectedValue==null) return;
            Expenses objSubAccHead = new Expenses();
            colSubAccHead.DataSource=objSubAccHead.getSubAccountHead(cmb.SelectedValue.ToString());
           
           
        }



It shows correct values.
But if the user selects both comboboxes and then changes the first so that the second is no longer valid.
Then it shows an error:
System.ArgumentException:DataGridViewComboBoxCell value is not valid
To Replace this default dialog please handle DataError Event.

What should i do? Any Help would be appreciated.
Thanks


HI,


you can also try http://www.asp.net/ajaxlibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx[^]


这篇关于在运行时添加combobx并在更改第一个的选定值时填充另一个组合框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆