如何在执行一次后删除一个函数

时间:2011-08-15 06:46:33

标签: c# winforms function methods c#-2.0

我有一个在单选按钮检查事件下执行的功能,但它必须只执行一次。在随后的单选按钮检查事件中,不应调用我的函数。

void rb_CheckedChanged(x, y)
{
    LoadSomeData(); //need to load only once.
    // rest of the code; to be executed every single time..
}

注意:

  1. 我希望LoadSomeData()仅在单选按钮事件下执行。

  2. 我可以设置一个整数成员变量,并计数++,n检查是否== 1等。或者布尔标志。那不是我想要的。

  3. 谢谢..

5 个答案:

答案 0 :(得分:1)

您可以设置hidden field并将其用作标志,以确定是否应再次运行LoadSomeData。类似的东西:

void rb_CheckedChanged(x, y)
{
    if (hiddenField.Value == "False")
    {
        LoadSomeData(); //need to load only once.
        hiddenField.Value = true.ToString();
    }
    else
    {
         // Do nothing.
    }
    // rest of the code; to be executed every single time..
}

在您的页面中:

<asp:HiddenField ID="hiddenField" Value="False" />

答案 1 :(得分:1)

我认为选项2是你最好的选择,周围有一个粘性的bool。

private bool stickyFlag = true;

void rb_CheckedChanged(x,y)
{
    if (true == stickyFlag)
    {
        LoadSomeData();
        stickyFlag = false;
    }
    ....
    // rest of the code; to be executed every single time..
}

答案 2 :(得分:1)

你可以做的是创建一个你想在事件中调用的函数名列表,然后从列表中获取方法名,使用反射调用你感兴趣的方法,然后从列表中删除该方法名...下次,当再次调用该事件时,该方法将不会在它不在列表中之前执行..类似于:

List<string> listMethod = new List<string>();
listMethod.Add("LoadSomeData");

然后

void rb_CheckedChanged(x, y)
{
string methodName = listMethod[0];
Type.InvokeMember(
                    methodName,
                    BindingFlags.InvokeMethod | BindingFlags.Public | 
                        BindingFlags.Static,
                    null,
                    null,
                    null);
listMethod.Clear(); //or remove what ever you want
}

您可以从http://www.codeproject.com/KB/cs/CallMethodNameInString.aspx

获取有关动态方法调用的信息

答案 3 :(得分:1)

您可以使用PostSharp [RunOnce]

创建属性

此属性可能具有表明该方法已被触发的属性

PostSharp Link

答案 4 :(得分:1)

我会选择第二个选项,但你可以使用代表:

public event Action doLoadSomeData; 

void onLoad(sender, args)
{
    doLoadSomeData += LoadSomeData();
}

void rb_CheckedChanged(x, y)
{
    if (doLoadSomeData != null)
    {
         doLoadSomeData(); //need to load only once.
    }
    doLoadSomeData = null;
    // rest of the code; to be executed every single time..
}