【问题标题】:Refreshing the listbox item after an element is changed更改元素后刷新列表框项
【发布时间】:2012-08-20 00:07:32
【问题描述】:

我有一个 ParameterItem 类,用于将一些项目添加到列表框:

class ParameterItem
{
    public string Name { get; set; }
    public string Value { get; set; }

    public ParameterItem(string name, string value)
    {
        Name = name;
        Value = value;
    }

    public override string ToString()
    {
        return Name + " = " + Value;
    }

    public override bool Equals(object obj)
    {
        if (obj is ParameterItem)
            return (Name == ((ParameterItem)obj).Name);

        return false;   
    }

    public override int GetHashCode()
    {
        return Name.ToLowerInvariant().GetHashCode();
    }
}

您可以使用两个文本框(名称和值)将项目添加到列表框。当您单击列表框中的某个项目时,文本框将填充 ParameterItem 的名称和值。我有以下代码来更改列表框中所选 ParameterItem 的内容:

    private void btnSaveParameter_Click(object sender, EventArgs e)
    {
        ParameterItem currentParameter = new ParameterItem(textParameterName.Text,
                                                           textParameterValue.Text);
        // If we already have the parameter set then edit it.
        if (lstbxSetParameters.Items.Contains(currentParameter))
        {
            ((ParameterItem)lstbxSetParameters.SelectedItem).Value = currentParameter.Value;
            lstbxSetParameters.;
        }
        // If it's not set yet then add it to the listbox.
        else
        {
            lstbxSetParameters.Items.Add(currentParameter);
            textParameterName.Text = String.Empty;
            textParameterValue.Text = String.Empty;
        }
    }

问题是,即使我可以更改所选ParameterItem的内容,在列表框中,它仍然看起来没有改变。

例如我在列表框中有一个参数:

TestParameter = 10

我将 ParameterItem 更改为

TestParameter = 5

但在列表框中它仍然看起来像

TestParameter = 10

即使它已经改变了。

我该如何解决这个问题?我认为列表框项应该再次调用 ParameterItem 的ToString() 方法并刷新自身但是如何?

或者有没有更好的方法在列表框中添加键值对?

【问题讨论】:

  • 您的 SelectedItem 并不总是与 currentParameter 匹配的那个
  • 当列表框中选择的项目发生变化时,文本框中的值也会发生变化,我没有添加那部分。我想这就是你说它不会永远是那个的原因。

标签: c# listbox listboxitem


【解决方案1】:

您可以通过删除并重新插入来更改所选项目。

// If we already have the parameter set then edit it.
if (lstbxSetParameters.Items.Contains(currentParameter))
{
    var newItem = new ParameterItem((lstbxSetParameters.SelectedItem as ParameterItem).Name, currentParameter.Value);
    var index = lstbxSetParameters.SelectedIndex;
    lstbxSetParameters.Items.RemoveAt(index);
    lstbxSetParameters.Items.Insert(index, newItem);
    lstbxSetParameters.SelectedIndex = index;
}

【讨论】:

    【解决方案2】:

    我的解决方案:

    string[] nList = new string[lb.Items.Count];
    nList = lb.Items.OfType<string>().ToArray();
    nList[lb.SelectedIndex] = newValue;
    lb.Items.Clear();
    lb.Items.AddRange(nList);
    

    这种方式不是更改所选项目(有很多问题),而是重新加载列表框,并在数组中更改项目。

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 2023-01-31
      • 1970-01-01
      相关资源
      最近更新 更多