如何将对自定义事件或方法的重复调用减少为一个?

时间:2019-01-18 14:53:13

标签: c# winforms

如果我的事件/方法在第一次调用之前被调用了两次,它应该像只被调用一次一样做出反应。超过1个连续呼叫应减少为1。

我相信这就是Winforms中的Control.Invalidate方法的作用。

我有一个容器控件(基于FlowLayoutPanel)。控件的ID号在删除或添加其中的某些控件时必须更新(它们应具有从1开始的连续ID)。更新ID的方法是RefreshDisplay,在执行返回到主消息循环之前,可以多次调用它。

更新1:

我认为Invalidate方法减少了对其的多次连续调用。 documentation说:

  

使控件的指定区域无效(将其添加到控件的更新区域,该区域是将在下一次绘制操作中重新绘制的区域 ),并导致将绘制消息发送到控件。

就我而言,这是一种方法,但我还想到了使用事件处理程序将其作为事件。

在以下情况下调用RefreshDisplay方法:

  1. 创建或删除一项(例如,删除DataGridView的一行或多行时);
  2. 集合中的项目移至同一集合中的另一个位置;
  3. 更改集合中的项目组(例如重命名或删除组);
  4. 在为集合创建视图时(例如在程序开始时);
  5. 当视图的子级设置为不可见或可见时(可见性是该子级模型的一部分)。

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;
    }
}

0 个答案:

没有答案