如何用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窗体工具一起使用。
您需要以编程方式添加控件:
var lb = new DoublebufferedListView();
yourForm.Controls.Add(lb);
[旧版本的visual studio]
或者,右键单击工具箱,选择"自定义工具箱",然后从.NET Framework组件选项卡中,单击"浏览"并定位控件库DLL以将其添加到工具箱中。
[较新版本(来自msdn)]
在"工具"菜单上,单击"选择工具箱项"。
单击浏览。
将显示"打开"对话框。
在"文件夹"窗格中,选择"我的电脑"以浏览计算机驱动器上安装的项目。
单击"确定"。