【问题标题】:Toggling DisplayMember in a list box in C#在 C# 的列表框中切换 DisplayMember
【发布时间】:2016-08-13 16:37:53
【问题描述】:

我正在尝试在 VS 2010 的 C# Windows 应用程序的列表框中切换 DisplayMember 属性。

我目前有两个按钮可以更改 ListBox 的 DisplayMember,但我希望有一个按钮可以在两个可用按钮之间切换。

一键使用

lstResults.DisplayMember = "Word";

在我使用的另一个中

lstResults.DisplayMember = "Hooks";

效果很好,但是当我尝试使用时

If (lstResults.DisplayMember == "Word") 
   lstResults.DisplayMember = "Hooks"; 
else 
   lstResults.DisplayMember = "Word";

我已对其进行了跟踪,但 DisplayMember 没有响应新分配。它不会在代码中更改。但它确实在 Listbox 本身中发生了变化。因此,我最终将 DisplayMember 卡在代码中的“Word”,并在实际显示中卡在“Hooks”。

为了使事情更具挑战性,在我删除 ListBox 并将其添加回表单之前,原始按钮将无法使用。我已经清理并重建了,没有任何变化。

我也试过

if (lstResults.DisplayMember.Equals("Word"))

没有区别。

【问题讨论】:

  • 你能展示你的数据源吗?除非 DataSource 中没有名为 HooksWord 的属性,否则您的代码应该可以正常工作。
  • 数据源仅由 WordID、Word(字符串)、Hooks(字符串)组成。除非我尝试比较 DisplayMember,否则它会起作用。

标签: c# .net windows listbox


【解决方案1】:

这里是简单的解决方案。你只需要一个按钮,比如说 button2 并在下面给出一个点击处理程序

   if (this.button2.Text == "Show ID")
        {
            this.comboBox1.DisplayMember = "Name";
            button2.Text = "Show Name";
        }
        else
        {

            this.comboBox1.DisplayMember = "ID";
            button2.Text = "Show ID";
        } 

comboBox1 是您的组合框。

【讨论】:

  • 它不是组合框,但它确实适用于列表框。
  • 请检查它是否也适用于 ListBox。您正在使用 winForms 或 WebForms???
【解决方案2】:

使用 Edward Islam 的策略,但还有一个问题以相同的方式锁定 ListBox 的 DisplayMember。 当我附加事件 SelectedValueChanged 时,除非我将新数据源分配给 ListBox,否则 DisplayMember 不会更改。 列表框使用“Hooks”作为 DisplayMember,但代码显示“Word”,我无法更改它。像这样锁定 DisplayMember 属性的原因是什么?

private void lstResults_SelectedIndexChanged(object sender, EventArgs e)
{
    int sIndex = lstResults.SelectedIndex + 1;
    int count = lstResults.Items.Count;
    this.statusCount.Text = String.Format("{0} / {1}", sIndex, count);
    string selection = lstResults.Text;
if (sIndex > 0)
    {
        int value = Hoot.ValueCalc.getValue(selection);
        double probable = Hoot.Probability.getProbable(selection);
        int relativeProbable = Hoot.Probability.getRelProbable(selection);
        this.statusWordStats.Text = String.Format("Raw Score: {0}   Probability: {1} (RP: {2})",
            value, probable.ToString("F4"), relativeProbable.ToString());
    }
}

【讨论】:

    【解决方案3】:

    我发现了第二个相关问题的解决方案。 我逐渐将所有语句添加回来,直到得到概率(双概率 = Hoot.Probability.getProbable(selection);),这涉及组合和大量内存。虽然该方法没有改变传递的变量,但我认为内存正在影响内容,所以我修改了我传递的参数。

    我尝试改变

    string selection = lstResults.Text;
    

    string selection = String.Copy(lstResults.Text);
    

    同样的问题。

    然后我把它换成了

        HookSet selector = (HookSet)lstResults.SelectedItem;
        string selection = String.Copy(selector.Word.ToString());
    

    列表框的数据源是一个

    List<HookSet>
    

    成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多