ComboBox DataSource 没有按我预期的那样工作[重复]

Posted

技术标签:

【中文标题】ComboBox DataSource 没有按我预期的那样工作[重复]【英文标题】:ComboBox DataSource is not working as I expect [duplicate] 【发布时间】:2021-01-16 21:56:16 【问题描述】:

我正在尝试将DataSource 与组合一起使用。目前我有这个:

private void EditMaterialsForm_Load(object sender, EventArgs e)

    try
    
        cbMaterialGroups.DataSource = _docMaterialsDB.MaterialGroup;
        cbMaterialGroups.DisplayMember = "Name";
        //foreach(CutToolsDatabaseMaterialGroup oMaterialGroup in _docMaterialsDB.MaterialGroup)
        //
        //    cbMaterialGroups.Items.Add(oMaterialGroup.Name);
        //
    
    catch (System.IO.FileNotFoundException /*e*/)
    
        // TODO
        this.BeginInvoke(new MethodInvoker(this.Close));
    

    if (cbMaterialGroups.Items.Count > 0)
        cbMaterialGroups.SelectedIndex = 0;

    SetControlStates();

但它并没有像我预期的那样显示数据:

如果我注释掉我的绑定尝试,然后尝试原来的 foreach 循环,我会得到我期望的结果:

我试过设置:

cbMaterialGroupsValueMember = "Name";

但是它引发了一个异常。

如何让它显示正确的值?我错过了一些东西。

更新

我在课堂上有name 属性:

public class CutToolsDatabaseMaterialGroup

    [XmlElement]
    public string Name;

    [XmlElement(ElementName = "Material")]
    public List<CutToolsDatabaseMaterial> Materials;

    public CutToolsDatabaseMaterialGroup()
    
        Name = "";
        Materials = new List<CutToolsDatabaseMaterial>();
    

还有:

public class CutToolsDatabaseMaterial

    [XmlElement]
    public string Name;

    [XmlArray]
    [XmlArrayItem(ElementName ="Value")]
    public List<string> Text;

    public CutToolsDatabaseMaterial()
    
        Name = "";
        Text = new List<string>();
    

更新

我尝试了链接的答案并使用了:

   public partial class EditMaterialsForm : Form
    
        private MaterialsDatabase.CutToolsDatabase _docMaterialsDB;
        private BindingSource bindingMaterialGroups = new BindingSource();

        public EditMaterialsForm()
        
            InitializeComponent();
        

        private void EditMaterialsForm_Load(object sender, EventArgs e)
        
            try
            
                bindingMaterialGroups.DataSource = _docMaterialsDB.MaterialGroup;

                cbMaterialGroups.DataSource = bindingMaterialGroups.DataSource;
                cbMaterialGroups.DisplayMember = "Name";
                cbMaterialGroups.ValueMember = "Name";
                //foreach(CutToolsDatabaseMaterialGroup oMaterialGroup in _docMaterialsDB.MaterialGroup)
                //
                //   cbMaterialGroups.Items.Add(oMaterialGroup.Name);
                //
            
            catch (System.IO.FileNotFoundException /*e*/)
            
                // TODO
                this.BeginInvoke(new MethodInvoker(this.Close));
            

            if (cbMaterialGroups.Items.Count > 0)
                cbMaterialGroups.SelectedIndex = 0;

            SetControlStates();
        

但我仍然遇到异常:

【问题讨论】:

我自己什至没有尝试在 winforms 中进行绑定,但从已接受的重复答案看来,您似乎缺少 BindingSource 简单地谷歌搜索错误信息是值得的。见this。您必须使用 properties 进行绑定,将 Name 设为属性。 @Sinatr 我看到了。其他cmets说那个答案不对所以我没有尝试。但我刚刚试过,没问题。谢谢。 :) 错误的 cmets 不能被否决,您必须始终以一定的批评态度对待他们。人们也经常犯other错误,这使得答案对他们不起作用。 【参考方案1】:

确保您的班级或数据源中有Name 属性

【讨论】:

分享你的 _docMaterialsDB.MaterialGroup 让我看看 我接受这个答案。我把它作为一个公共领域而不是公共财产。

以上是关于ComboBox DataSource 没有按我预期的那样工作[重复]的主要内容,如果未能解决你的问题,请参考以下文章

当 DataSource 值更改时,WinForms ComboBox 中的项目不会更新

DataSource 更改时,ComboBox 不会自动更新?

为啥设置 DataSource 时 ComboBox 不抛出异常?

ComboBox 自动 DropDownWidth 与 DataSource 类型无关

C# winForm程序 数据绑定 更新控件问题 combobox绑定的DataSource 数据表中已经添加了新的数据

comboBox的id返回System.Data.DataRowView