首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

combobox的bug有关问题再开第二贴,不信没有高手,为了说明有关问题,已将所有数据在内存中构建,麻烦您在开发环境粘一下看看

2012-03-02 
combobox的bug问题再开第二贴,不信没有高手,为了说明问题,已将所有数据在内存中构建,麻烦您在开发环境粘一

combobox的bug问题再开第二贴,不信没有高手,为了说明问题,已将所有数据在内存中构建,麻烦您在开发环境粘一下看看
public   partial   class   Form2   :   Form
        {
                DataTable   comboBoxDataTable   =   new   DataTable();
                DataTable   inputDataTable   =   new   DataTable();

                static   int   ii   =   0;
                public   Form2()
                {
                        InitializeComponent();
                        //设定数据录入表
                        inputDataTable.Columns.Add( "nsr_swjg_dm ",   typeof(string));
                        inputDataTable.Columns.Add( "swjg_mc ",   typeof(string));
                        //初始化数据源
                        sb_zsxxBindingSource.DataSource   =   inputDataTable.DefaultView;
                        sb_zsxxDataGridView.DataSource   =   this.sb_zsxxBindingSource;
                }

                private   void   comboBox1_SelectedIndexChanged(object   sender,   EventArgs   e)
                {
                        if   (sb_zsxxBindingSource.Position   > =   0)
                        {
                                //如果没有inputDataTable.Rows[sb_zsxxBindingSource.Position][ "SWJG_MC "]   =   this.comboBox1.Text;
                                //这句,那么下面这句是能正常执行的
                                this.textBox1.Text   =   this.comboBox1.Text; 
                                //加上以下这句不仅不能执行,而且comboBox1不能选择上任何一项
                                inputDataTable.Rows[sb_zsxxBindingSource.Position][ "SWJG_MC "]   =   this.comboBox1.Text;
                               
                        }
                }

                private   void   Form2_Load(object   sender,   EventArgs   e)
                {
                        //设定下拉列表


                        comboBoxDataTable.Columns.Add( "aa ",typeof(System.String));
                        comboBoxDataTable.Columns.Add( "bb ",typeof(System.String));

                        for   (int   i   =   0;   i   <   10;   i++)
                        {
                                DataRow   dr   =   comboBoxDataTable.NewRow();
                                dr[0]   =   i.ToString();
                                dr[1]   =   i.ToString()   +   i.ToString();
                                comboBoxDataTable.Rows.Add(i);
                        }
                        this.comboBox1.DataBindings.Add(new   System.Windows.Forms.Binding( "SelectedValue ",   this.sb_zsxxBindingSource,   "nsr_swjg_dm ",   true));
                        this.comboBox1.DataSource   =   comboBoxDataTable;
                        this.comboBox1.ValueMember   =   "bb ";
                        this.comboBox1.DisplayMember   =   "aa ";
                }
                private   void   button1_Click(object   sender,   EventArgs   e)
                {
                        DataRow   row     =   inputDataTable.NewRow();
                        row[0]   =   "aa ";
                        row[1]   =   "bb ";
                        inputDataTable.Rows.Add(row);
                }          
        }

前两贴在:
http://community.csdn.net/Expert/topic/5519/5519589.xml?temp=.8443262
http://community.csdn.net/Expert/topic/5521/5521966.xml?temp=.9441034
那两贴的问题您就不必看了,程序员最能说明问题的就是代码,俺已将数据源都设置在代码中生成了,所以只要拉两个控件上去您就能运行这段代码,也能看出俺的问题的确不是那么简单的。
问题解决后麻烦您到那两贴上回个话,俺好一并给分。

[解决办法]
先帮顶在看看。
[解决办法]
不对啊,这是几个控件啊?不是两个
[解决办法]
明天帮你试验,估计是Rows要先add一个row才行
------解决方案--------------------


偶建个工程先,等会再抢分 :)
[解决办法]
帮顶
[解决办法]
this.comboBox1.DataBindings.Add(new System.Windows.Forms.Binding( "SelectedValue ", this.sb_zsxxBindingSource, "nsr_swjg_dm ", true));


这行多余了
你分明是给comboBox1指定了两次数据源嘛
[解决办法]
你在DataGridView中指定的数据源是inputDataTable//通过BindingSource指定
在ComboBox中指定的数据源是comboDataTable//通过DataTable指定

你无非就是想用ComboBox中的选择值去更新DataGridView当前选择行第二列的值,对吧?
[解决办法]
我想是一个循环引用的问题
如果加上那行代码的话,因为BindingSource的数据源同时也绑定到了ComboBox中,所以当ComboBox_SelectedIndex事件触发时,会同时导致ComboBox自身的数据源发生更改,而正常情况下,该数据源最好是恒定的
[解决办法]
ps.我想听听你说的“循环”是怎么回事 ?
[解决办法]
刚用Reflector看了ComboBox基类ListControl的DataSource实现,有这么一段比较关键的

private void SetDataConnection(object newDataSource, BindingMemberInfo newDisplayMember, bool force)
{
bool flag = this.dataSource != newDataSource;
bool flag2 = !this.displayMember.Equals(newDisplayMember);
//.....
if (flag)
{
this.OnDataSourceChanged(EventArgs.Empty);
}
if (flag2)
{
this.OnDisplayMemberChanged(EventArgs.Empty);
}

//.....

不知道您有没啥想法?

[解决办法]
在Reflector中没看到DataBindings这个属性,奇怪...

我觉得是,你在给ComboBox第一次指定数据源之后,紧接着第二次又指定不同的数据源,导致
bool flag = this.dataSource != newDataSource; // flag=true;
bool flag2 = !this.displayMember.Equals(newDisplayMember); //flag2=true;

所以后面的两行语句都会执行,至于执行之后是啥结果,我就没往下看了,呵呵 :)

[解决办法]
是个问题,界面上其他控件的数据源改变会导致combobox变成不选择状态(SelectedIndex=-1)
改变判断条件
if (sb_zsxxBindingSource.Position > = 0 && comboBox1.SelectedIndex > -1)
{
}
可以实现‘用ComboBox中的选择值去更新DataGridView当前选择行第二列的值’
但没有根本解决问题,ComboBox还是‘不能选择’
[解决办法]

this.comboBox1.DataBindings.Add(new System.Windows.Forms.Binding( "SelectedValue ", this.sb_zsxxBindingSource, "nsr_swjg_dm ", true));
这句去掉即可

热点排行