如何在 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 我的电脑浏览安装在您的计算机驱动器上的项目。
单击“确定”。
我是编程界的新手,无法理解如何从这里的答案中使用此代码: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 我的电脑浏览安装在您的计算机驱动器上的项目。
单击“确定”。