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));
这句去掉即可