当前位置: 首页 > 编程语言 > C#

ComboBoxitems.countdoesnotmatchDataSource(C#)分享

时间:2023-04-10 13:08:06 C#

ComboBoxitems.countdoesnotmatchDataSource(C#)我想根据特定条件将项目动态添加到ComboBox。所以我所做的是将选项添加到新列表,然后像这样更改ComboBox的数据源:cbo.DataSource=null;cbo.DataSource=cbos;cbo.DisplayMember="标题";cbo.ValueMember="值";然后,我检查cbo.Items.Count并且它没有递增-它不等于数据源的计数。我能想到什么?请注意,这是WinForms而不是asp.net。谢谢,你是现在还是稍后检查伯爵?在执行UI刷新等操作之前,ComboBox可能不会真正更新其内容,因此在此之前计数将关闭。如果在为组合框创建句柄之前更新数据源,就会发生这种情况。我在反射器上挖掘了一些代码,看起来在实际创建和呈现ComboBox之前,在这种情况下该项目不会更新。如果有人对动态添加的组合框有这个问题,答案是确保将组合框添加到表单中的容器控件中。添加“this.Controls.Add(cbo);”在设置数据源之前添加到代码中,问题就消失了。我找到了原因......我取出了cbo.Datasource=null行......并在最后添加了一个cbo.Invalidate()。这解决了问题。谢谢大家的建议。cbo.DataSource=null;cbo.DataSource=cbos;cbo.DisplayMember="标题";cbo.ValueMember="值";现在在设置cbo.SelectedValue之前,或者根据Items是最新的,调用cbo.CreateControl;并且Items将被重新计算。问题在于,作为WinForms属性的SelectedValue/SelectedIndex只接受根据Items列表合法的值,但仅在GUI交互之后构建,即在实例化“真实的”WindowsGUI组合框之后,即在获取组合框的窗口之后处理。不管怎样,CreateControl都会强制创建Windows句柄。还有一个“DataSourceChanged”事件...也许这可能有助于澄清您是否在调用databind()方法后调用count()方法此代码在消息框中为我生成2,您可以尝试看看它对你的表现如何?您可以将其粘贴到控制台应用程序中并添加对System.Windows.Forms和System.Drawing的引用。使用系统;使用System.Collections.Generic;使用System.Windows.Forms;使用系统绘图;命名空间SO887803{静态类程序{[STAThread]staticvoidMain(){Application.Run(newMainForm());}}publicpartialclassMainForm:Form{privateButton_Button;私人组合框_ComboBox;publicMainForm(){_Button=newButton();_Button.Text="测试";_Button.Location=newPoint(8,8);_Button.Click+=_Button_Click;控制.Add(_Button);_ComboBox=newComboBox();_ComboBox.Location=newPoint(8,40);Controls.Add(_ComboBox);}privatevoid_Button_Click(objectsender,EventArgse){Listitems=newList();items.Add(新项目("A","a"));items.Add(新项目("B","b"));_ComboBox.DataSource=null;_ComboBox.DataSource=项目;_ComboBox.DisplayMember="标题";_ComboBox.ValueMember="值";MessageBox.Show("计数:"+_ComboBox.Items.Count);}publicclassItem{publicStringTitle{get;放;}公共字符串值{ge吨;放;}publicItem(Stringtitle,Stringvalue){Title=title;价值=价值;}}}}comboBox1.DataSource=somelist;intc1=comboBox1.DataSource.Count;//仍然为零BindingContextdummy=this.comboBox1.BindingContext;//立即强制更新!intc2=comboBox1.DataSource.Count;//现在它等于somelist.Count我遇到了同样的问题(我使用的是VS2005)你需要做的是将DataSource设置为null,清除项目,重新分配数据源,显示和值成员。cbo.DataSource=null;cbo.Items.Clear();cbo.DataSource=cbos;cbo.DisplayMember="标题";cbo.ValueMember="值";旧线程,但我尝试了其中一些解决方案,以及暂停/恢复绑定上下文、绑定和重置绑定源,只需重新加载表单即可。当我的.datasource被设置时,没有人用新绑定的数据更新我的控件(我的items.count是空的,就像OP一样)。然后我意识到我的组合框位于一个选项卡上,该选项卡在代码开头被删除并稍后重新添加(在我的数据绑定之后)。在重新添加选项卡之前不会发生绑定事件。回想起来似乎很明显,但由于调用顺序和无法判断何时发生更改,因此很难在运行时检测到。ComboBoxcbNew=newComboBox();cbNew.Name="cbLine"+(i+1);cbNew.Size=cbLine1.Size;cbNew.Location=newPoint(cbLine1.Location.X,cbLine1.Location.Y+26*i);cbNew.Enabled=false;cbNew.DropDownStyle=ComboBoxStyle.DropDownList;cbNew.DataSource=DBLayer.GetTeams(lineName).Tables[0];cbNew.DisplayMember="teamdesc";cbNew.ValueMember="id";Console.WriteLine("ComboBox{0},itemcount={1}",cbNew.Name,cbNew.Items.Count);//对于运行时创建的控件,输出显示itemcount=0//对于在设计时创建的控件,输出显示>0gbLines.Controls.Add(cbNew);至ComboBoxcbNew=newComboBox();cbNew.Name="cbLine"+(i+1);cbNew.Size=cbLine1.Size;cbNew.Location=newPoint(cbLine1.Location.X,cbLine1.Location.Y+26*i);cbNew.Enabled=false;cbNew.DropDownStyle=ComboBoxStyle.DropDownList;Console.WriteLine("ComboBox{0},itemcount={1}",cbNew.Name,cbNew.Items.Count);//运行时cre的输出显示itemcount=0atecontrols//和>0用于在设计时创建的控件gbLines.Controls.Add(cbNew);cbNew.DataSource=DBLayer.GetTeams(lineName).Tables[0];cbNew.DisplayMember="teamdesc";cbNew.ValueMember="id";将控件添加到其容器后,必须设置DataSource、DisplayMember和ValueMember属性baram,可以简单地通过preformLayout()函数刷新UI;例子:comboBox1.performLayout();请试试mohsen试试这个:cbo.Parent=;cbo.DataSource=null;cbo.DataSource=cbos;cbo.DisplayMember="标题";cbo.ValueMember="值";MessageBox.Show(string.Format("itemcountis{0}",cbo.Items.Count);我想你的问题和我今天遇到的一样,以上就是C#学习教程:ComboBoxitems的全部内容。count与数据源(C#)不符,有用,需要多了解C#学习教程,希望大家多多关注,本文收集自网络,不代表立场,如有不妥涉及侵权,请点击维权联系管理员删除,如需转载请注明出处: