如何用C#中的可重用类改进windows窗体工具

本文关键字:windows 工具 窗体 何用 | 更新日期: 2023-09-27 18:20:17

我是编程界的新手,无法从Robert Jeppesen的"如何避免数千个不必要的ListView.SelectedIndexChanged事件"中理解如何使用此代码。

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:
 /// https://stackoverflow.com/questions/86793/how-to-avoid-thousands-of-needless-listview-selectedindexchanged-events
 /// </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());
 }
}

因此,它是一个可重用的类,我想将它的行为添加到我已经存在的ListViews中。我目前正在同一个url上使用Ian Boyd提供的代码进行管理,并将此代码添加到我的所有ListView中。问题是,我目前正在开发的ERP程序中已经有太多ListView了,而且新的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
}

我试着从谷歌上搜索这个话题的答案,但我用的关键词找不到合适的文章。希望这里有人能指导我如何将这些被视为"组件"的"类"与windows窗体工具一起使用。

如何用C#中的可重用类改进windows窗体工具

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

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

[旧版本的visual studio]

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

[较新版本(来自msdn)]

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

单击浏览。

将显示"打开"对话框。

在"文件夹"窗格中,选择"我的电脑"以浏览计算机驱动器上安装的项目。

单击"确定"。