如果我的事件/方法在第一次调用之前被调用了两次,它应该像只被调用一次一样做出反应。超过1个连续呼叫应减少为1。
我相信这就是Winforms中的Control.Invalidate
方法的作用。
我有一个容器控件(基于FlowLayoutPanel
)。控件的ID号在删除或添加其中的某些控件时必须更新(它们应具有从1
开始的连续ID)。更新ID的方法是RefreshDisplay
,在执行返回到主消息循环之前,可以多次调用它。
更新1:
我认为Invalidate
方法减少了对其的多次连续调用。 documentation说:
使控件的指定区域无效(将其添加到控件的更新区域,该区域是将在下一次绘制操作中重新绘制的区域 ),并导致将绘制消息发送到控件。
就我而言,这是一种方法,但我还想到了使用事件处理程序将其作为事件。
在以下情况下调用RefreshDisplay
方法:
DataGridView
的一行或多行时); RefreshDisplay
方法(我希望将其连续调用减少为1)是通过以下方式实现的接口的一部分:
1。
public void RefreshDisplay()
{
SuspendLayout();
int i = 0;
foreach (ClockDataGridViewRow r in Rows)
{
if (r.IsNewRow)
{
continue;
}
r.HeaderCell.Value = (i + 1).ToString();
if (!r.MyClockData.FilteredOut)
{
++i;
}
}
ForceUpdateZoomFactor(ZoomFactor);
ResumeLayout(true);
}
2。
public void RefreshDisplay()
{
SuspendLayout();
int i = 0;
foreach (ClockData td in MyDataFile.ClockCollection.ClocksData)
{
foreach (IClockView tv in td.MyTimerViews)
{
if (tv is ClockControl tc &&
tc.GetTimersView() == this)
{
tc.SetTagText((i + 1).ToString());
}
}
if (!td.FilteredOut)
{
++i;
}
}
ResumeLayout(true);
}
3。
public void RefreshDisplay()
{
MyListView.Items.Clear();
UpdateListViewImageLists(ZoomPercent);
ListViewItem it = MyListView.Items.Add("All");
it.Tag = new Filter()
{
ShowActive = true,
ShowInactive = true,
ShowTimers = true,
ShowAlarms = true
};
it.ImageIndex = 1;
ListViewItem itActive = MyListView.Items.Add("Active");
itActive.Tag = new Filter()
{
ShowActive = true,
ShowInactive = false,
ShowTimers = true,
ShowAlarms = true
};
itActive.ImageIndex = 2;
ListViewItem itInactive = MyListView.Items.Add("Inactive");
itInactive.Tag = new Filter()
{
ShowActive = false,
ShowInactive = true,
ShowTimers = true,
ShowAlarms = true
};
itInactive.ImageIndex = 3;
ListViewItem itTimers = MyListView.Items.Add("Timers");
itTimers.Tag = new Filter()
{
ShowActive = true,
ShowInactive = true,
ShowTimers = true,
ShowAlarms = false
};
itTimers.ImageIndex = 4;
ListViewItem itAlarms = MyListView.Items.Add("Alarms");
itAlarms.Tag = new Filter()
{
ShowActive = true,
ShowInactive = true,
ShowTimers = false,
ShowAlarms = true
};
itAlarms.ImageIndex = 5;
int gi = 0;
foreach (string g in MyDataFile.ClockCollection.Groups)
{
ListViewItem item = MyListView.Items.Add(g);
item.Tag = new Filter()
{
ShowActive = true,
ShowInactive = true,
ShowAlarms = true,
ShowTimers = true
};
(item.Tag as Filter).GroupIndices.Add(gi);
Image ico;
if (MyDataFile.ClockCollection.Groups.Icons.ContainsKey(g))
{
// possibly null:
ico = MyDataFile.ClockCollection.Groups.Icons[g];
}
else
{
ico = null;
}
MyListView.SmallImageList.Images.Add(
ico ?? new Bitmap(1, 1));
MyListView.LargeImageList.Images.Add(
ico ?? new Bitmap(1, 1));
if (ico != null)
{
item.ImageIndex = item.Index + 5;
}
else
{
item.ImageIndex = 0;
}
++gi;
}
}