【问题标题】:Events for adding/removing items in a listbox c#.NET用于在列表框 c#.NET 中添加/删除项目的事件
【发布时间】:2011-12-13 05:06:30
【问题描述】:

我有一个列表框控件,其中动态添加了 items 并手动从中删除(由于“删除项目”按钮)。当项目数量发生变化时,我想更新用户界面的其他部分 - 即“您必须选择一些文件”的标题。和项目计数说明。

当项目的数量发生变化时,如何添加事件处理程序或有效地触发事件处理程序 - 例如ItemAddedItemRemovedItemsChanged

注意:这与用户在列表框中选择项目无关。

非常感谢!

【问题讨论】:

    标签: c# .net winforms events listbox


    【解决方案1】:

    您可以尝试使用BindingList<> 作为您的DataSource,然后根据该列表而不是您的ListBox 执行操作——它会自动从BindingList 获取更新。

    BindingList 有一个 ListChanged 事件。

    ListChanged 事件有一个 ListChangedEventArgs,其中包含一个 ListChangedType 枚举器:

    BindingList<string> list = new BindingList<string>();
    list.ListChanged += new ListChangedEventHandler(list_ListChanged);
    
    void list_ListChanged(object sender, ListChangedEventArgs e) {
      switch (e.ListChangedType){
        case ListChangedType.ItemAdded:
          break;
        case ListChangedType.ItemChanged:
          break;
        case ListChangedType.ItemDeleted:
          break;
        case ListChangedType.ItemMoved:
          break;
        // some more minor ones, etc.
      }
    }
    

    【讨论】:

    • ((CurrencyManager)ListBoxName.BindingContext[list]).Refresh(); 可用于list_ListChanged 的开头,以保持lisybox 处于最新状态。
    【解决方案2】:

    在“删除项目”按钮的代码中,还更新了 UI 的其他部分。这不必违反编码原则;你可以这样做:

    void UpdatePartsOfTheUI() {
        // Do something here
        if(myListBox.Items.Count == 0) {
            myLabel.Text = "You must choose some files!";
        } else {
            myLabel.Text = String.Empty;
        }
    }
    
    /* ... */
    
    void myButton_Click(object sender, EventArgs e) {
        if(myListBox.SelectedIndex > -1) {
            // Remove the item
            myListBox.Items.RemoveAt(myListBox.SelectedIndex);
    
            // Update the UI
            UpdatePartsOfTheUI();
        }
    }
    

    如果您没有很多按钮来更改列表框,则此方法有效。如果这样做,只需将 ListBox 的 Items.Add/Items.Insert/Items.Remove 包装在包含其他代码的方法中,然后从按钮处理程序中调用这些方法。

    【讨论】:

      【解决方案3】:

      创建一个方法,您可以对 ListBox 项做任何您想做的事情。 例如:

      我的程序根据请求或流请求从服务器接收数据馈送。 在我的 winform1.cs 中,我将数据添加到列表框中的控件如下所示。

      public void AddData(string data)
          {
              if (this.ResponseData.InvokeRequired)
                  BeginInvoke(new AddDataDelegate(AddData), new object[] { data });
              else
              {
                  this.ResponseData.Items.Insert(0, data);
                  DataDistro();
      
              }
      
          }
      

      DataDistro 是我用来处理新数据的我的方法。另请注意,通过在索引值 0 处插入,新项目将始终位于顶部。

      如果您使用的是 winForm,这会容易得多,此外,因为添加项目是由委托处理的,所以主线程仍然是打开的。如果您不使用将所有数据添加到列表框的方法,这将不起作用。使用上面提到的 bindingsource 方法将是下一个最好的方法。

      这是我的 DataDistro 方法的示例:我的响应字符串如下所示:[Q],ATQuoteLastPrice,value [B],datetime,open,high,low,close,volume

      private void DataDistro()
      {
          string data = ListBox.Items[0].ToString();
          string[] split = data.Split(new string[] {","}, stringsplitoptions.None);
          if(spit[0] == "[Q]")
          {
              //do some work
          }
          if(split[0] == "[B]")
          {
               //Do some work
          }
      }
      

      在您的情况下,您将在删除项目按钮单击结束时调用您的方法。如果工作量很大,我还建议做一个代表或 backgroundWorker。由于从按钮单击事件调用将由 UI 线程处理。

      每次调用 AddData 方法时,添加数据后也会调用 DataDistro 方法。

      【讨论】:

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