【问题标题】:C# Re-populating Dictionary after clearing/setting it to nullC# 清除/设置为空后重新填充字典
【发布时间】:2013-03-17 09:10:31
【问题描述】:

我有一个充满 KeyValuePairs (equalityMap) 的字典,我用它来填充组合框 (comBox1)。

我想调用下面的函数作为初始化 comBox1 的一部分。然后,我有一个来自另一个组合框 (comBox2) 的 selectedValueChanged 事件,它调用以下函数并根据 comBox2 的选定值的类型更改 comBox1 的内容。

第一次初始化等式组合框时,一切都按预期工作。但是,当再次调用此函数时,组合框中不仅会显示“键”,还会以 ["key", "value"] 的格式显示“键”和“值”

我才刚刚开始使用 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);
    }

这里有几张图片来说明问题 初次通话

.

在后续调用中

.

固定:

事实证明,当我重新绑定 DataSource 时,它​​每次都会清除 DisplayMember 属性 -

this.equalities.DisplayMember = "Key";

当您将重新绑定数据源的行移到这些分配之上时,它可以解决问题。

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

【问题讨论】:

  • 请提供equalityMap的声明。
  • 假设equalities 是标准 ComboBox 控件,我无法重现您的问题。您是否可以提供任何其他可能会影响解决方案的相关代码?
  • 在第一次填充组合框后调用的唯一代码,如第一张图片,是上面的事件和 popEqualities 函数。
  • 对不起。仍然无法重现。我可以推荐的最好的方法是重新定义您的equalitiesMap 列表,使其基于具有名称、运算符和类型的struct,然后在您的searchFieldChanged 函数中设置DataSource = equalitiesMap.Where(x =&gt; x.Type == getFieldType())。还将您的 DisplayMember 更改为 Name 并将 ValueMember 更改为 Operator。

标签: c# dictionary combobox datasource keyvaluepair


【解决方案1】:

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

如果您只想显示密钥,则必须使用Key-property 并将其打印出来。

查看MSDNSystem.Collections.Generic.Dictionary&lt;TKey, TValue&gt; 的方法/属性。

【讨论】:

  • 我认为这就是这两行所做的 - this.equalities.DisplayMember = "Key"; this.equalities.ValueMember = "价值";正如我所说,它在第一次调用此函数时起作用。
  • 你为什么要在你的活动中重新绑定this.equalities.DataSource = new BindingSource(equalityMap, null);
  • 原本是为了让这个函数可以重用。我可以移动那条线,所以它只会在最初被调用。当EquityMap被设置为DataSource时,组合框会自动更新吗?
  • 如果你把它绑定到一个对象上,它当然会改变!见here
  • 在我的本地测试中,组合框没有刷新,因为字典中的数据发生了变化。
猜你喜欢
  • 2018-05-27
  • 2015-03-29
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多