清空/设置为null后重新填充C#字典

4
我有一个填充KeyValuePairs(equalityMap)的字典,我正在使用它来填充组合框(comBox1)。
我想在初始化comBox1时调用下面的函数。然后,我有一个selectedValueChanged事件来自另一个组合框(comBox2),它调用下面的函数并根据comBox2的选定值更改comBox1的内容。
当等式组合框首次初始化时,一切都按预期工作。但是,当再次调用此函数时,组合框中显示的不仅是“键”,而且还以["键","值"]的格式显示“键”和“值”。
我刚刚开始学习c#(或任何带GUI的东西),因此不确定调试此类问题的最佳方法。感谢您的帮助。
public void popEqualities(String fieldType)
    {

        this.equalities.DataSource = null;
        this.equalities.Items.Clear();
        this.equalityMap.Clear();

        if (fieldType == "string")
        {
            equalityMap.Add("is", "=");
            equalityMap.Add("is not", "!=");
            equalityMap.Add("contains", "CONTAINS");
            equalityMap.Add("begins with", "LIKE '%");
        }
        else if (fieldType == "int")
        {
            equalityMap.Add("is equal to", "=");
            equalityMap.Add("is not equal to", "!=");
            equalityMap.Add("is greater than", ">");
            equalityMap.Add("is less than", "<");
        }
        else if (fieldType == "date")
        {
            equalityMap.Add("is", "=");
            equalityMap.Add("is not", "!=");
            equalityMap.Add("is after", ">");
            equalityMap.Add("is before", "<");
        }
        else if (fieldType == "boolean")
        {
            equalityMap.Add("is", "=");
        }
        else
        {
            MessageBox.Show("Recieved bad Field Type");
            return;
        }

        this.equalities.DisplayMember = "Key";
        this.equalities.ValueMember = "Value";
        this.equalities.DataSource = new BindingSource(equalityMap, null);
    }  

编辑:声明权益映射时,我调用的是

this.equalityMap = new Dictionary<string, string>();

在类构造函数中,将以下内容作为类的私有成员。
private Dictionary<string, string> equalityMap

调用此函数的事件很简单。
public void searchFieldChanged(object sender, EventArgs e)
    {
        string fieldType = getFieldType();
        popEqualities(fieldType);
    }

这里有几张图片展示了问题:
在初始调用时,如下图所示:initial call
在随后的调用中,如下图所示:subsequent calls
解决方法是重新绑定数据源时会每次清除DisplayMember属性。
this.equalities.DisplayMember = "Key";

当您将重新绑定数据源的行移动到这些赋值之上时,它会解决问题。
this.equalities.DataSource = new BindingSource(equalityMap, null);
this.equalities.DisplayMember = "Key";
this.equalities.ValueMember = "Value";

请提供您的equalityMap声明。 - Rob Epstein
根据您提供的代码,假设equalities是一个标准的ComboBox控件,我无法重现您的问题。您能否提供其他相关的代码,可能会影响解决方案? - Rob Epstein
在第一张图片中,填充下拉框后唯一被调用的代码是上面的事件和popEqualities函数。 - Mark Gifford
抱歉,仍然无法复现。我能提供的最佳建议是重新定义您的equalitiesMap列表,以基于具有名称、运算符和类型的结构体,然后在您的searchFieldChanged函数中设置DataSource = equalitiesMap.Where(x => x.Type == getFieldType())。同时将您的DisplayMember更改为Name,ValueMember更改为Operator。 - Rob Epstein
1个回答

0

System.Collections.Generic.Dictionary中的一个条目包含属性KeyValue以显示其内容。如果您只想显示一个条目,则隐式使用ToString()方法,该方法将把条目的内容显示为["key", "value"]

如果您只想显示键,则必须使用Key属性并打印出来。

请查看MSDN以及System.Collections.Generic.Dictionary<TKey, TValue>的方法/属性。


我认为这两行代码是在做这件事情 -this.equalities.DisplayMember = "Key"; this.equalities.ValueMember = "Value";就像我说的,当第一次调用此函数时,它可以正常工作。 - Mark Gifford
你为什么要在事件中重新绑定 this.equalities.DataSource = new BindingSource(equalityMap, null); - bash.d
最初是为了使这个函数可重用。我可以将那行代码移动到只在最初调用时才执行。当 equityMap 被设置为 DataSource 时,组合框会自动更新吗? - Mark Gifford
如果将其绑定到对象上,它当然会发生变化!请参见此处 - bash.d
在我的本地测试中,当字典中的数据发生变化时,组合框没有刷新。 - Rob Epstein
原来当设置了数据源时,你无法使用clear()函数来清除控件的内容,所以我认为唯一的解决方法就是每次重新绑定数据源。 - Mark Gifford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接