如何在 C# 中使用可重用 类 改进 windows 表单工具?

How to improve windows form tools with reusable classes in C#?

我是编程界的新手,无法理解如何从这里的答案中使用此代码:How to avoid thousands of needless ListView.SelectedIndexChanged events Robert Jeppesen。

public class DoublebufferedListView : System.Windows.Forms.ListView
{
 private Timer m_changeDelayTimer = null;
 public DoublebufferedListView()
    : base()
 {
    // Set common properties for our listviews
    if (!SystemInformation.TerminalServerSession)
    {
       DoubleBuffered = true;
       SetStyle(ControlStyles.ResizeRedraw, true);
    }
 }

 /// <summary>
 /// Make sure to properly dispose of the timer
 /// </summary>
 /// <param name="disposing"></param>
 protected override void Dispose(bool disposing)
 {
    if (disposing && m_changeDelayTimer != null)
    {
       m_changeDelayTimer.Tick -= ChangeDelayTimerTick;
       m_changeDelayTimer.Dispose();
    }
    base.Dispose(disposing);
 }

 /// <summary>
 /// Hack to avoid lots of unnecessary change events by marshaling with a timer:
 /// 
 /// </summary>
 /// <param name="e"></param>
 protected override void OnSelectedIndexChanged(EventArgs e)
 {
    if (m_changeDelayTimer == null)
    {
       m_changeDelayTimer = new Timer();
       m_changeDelayTimer.Tick += ChangeDelayTimerTick;
       m_changeDelayTimer.Interval = 40;
    }
    // When a new SelectedIndexChanged event arrives, disable, then enable the
    // timer, effectively resetting it, so that after the last one in a batch
    // arrives, there is at least 40 ms before we react, plenty of time 
    // to wait any other selection events in the same batch.
    m_changeDelayTimer.Enabled = false;
    m_changeDelayTimer.Enabled = true;
 }

 private void ChangeDelayTimerTick(object sender, EventArgs e)
 {
    m_changeDelayTimer.Enabled = false;
    base.OnSelectedIndexChanged(new EventArgs());
 }
}

所以它是一个可重复使用的 class,我想将其行为添加到我现有的 ListView 中。我目前正在使用 Ian Boyd 在同一个 url 上提供的代码进行管理,将此代码添加到我所有的 ListView 中。问题是我目前正在处理的 ERP 程序中已经有太多的 ListView,而且新的一直在出现。一直重写相同的代码似乎很浪费。

Timer changeDelayTimer = null;

private void lvResults_SelectedIndexChanged(object sender, EventArgs e)
{
    if (this.changeDelayTimer == null)
    {
        this.changeDelayTimer = new Timer();
        this.changeDelayTimer.Tick += ChangeDelayTimerTick;
        this.changeDelayTimer.Interval = 200; //200ms is what Explorer uses
    }
    this.changeDelayTimer.Enabled = false;
    this.changeDelayTimer.Enabled = true;
}

private void ChangeDelayTimerTick(object sender, EventArgs e)
{
    this.changeDelayTimer.Enabled = false;
    this.changeDelayTimer.Dispose();
    this.changeDelayTimer = null;

    //Add original SelectedIndexChanged event handler code here
    //todo
}

我试图从 google 搜索该主题的答案,但我无法通过我使用的关键字找到合适的文章。希望这里有人可以指导我如何将这些 'classes' 视为 'components' 与 windows 表单工具一起使用的正确方向。

您需要以编程方式添加控件:

var lb = new DoublebufferedListView();
yourForm.Controls.Add(lb);

[旧版本 visual studio]

或者通过右键单击工具箱,selecting 自定义工具箱,然后从 .NET Framework 组件选项卡,单击浏览并找到控件库 DLL 以将其添加到工具箱。

[更新版本(来自 msdn)]

在“工具”菜单上,单击“选择工具箱项”。

单击浏览。

打开对话框出现。

在“文件夹”窗格中,select 我的电脑浏览安装在您的计算机驱动器上的项目。

单击“确定”。