离开事件在C#中被多次调用 [英] Leave Event is called more than once in C#

查看:72
本文介绍了离开事件在C#中被多次调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码



I have the below code

public void panel_item_collections_Click(object sender, EventArgs e)

        {



TextBox[] textbox_item_array = new TextBox[5];

            item_textbox.Add(textbox_item_array);

            textbox_item_array[0] =

new TextBox();

            textbox_item_array[0].Width = label_item_code.Width;

            textbox_item_array[0].Height = 26;

            textbox_item_array[0].Font = print_font_default;

            textbox_item_array[0].Location =

new Point(label_item_code.Location.X, 45 + (20 * row_count));

            textbox_item_array[0].Name =

string.Concat("item_code", row_count.ToString());

            panel_item_collections.Controls.Add(textbox_item_array[0]);

            textbox_item_array[0].Leave +=

new EventHandler(dynamic_text_item_code_Leave);

            textbox_item_array[0].KeyDown +=

new KeyEventHandler(bill_new_Form_KeyPress);

            textbox_item_array[0].DoubleClick +=

new EventHandler(bill_new_Form_DoubleClick);

            textbox_item_array[1] =

new TextBox();

            textbox_item_array[1].Width = label_item_descrition.Width;

            textbox_item_array[1].Font = textbox_item_array[0].Font;

            textbox_item_array[1].Location =

new Point(label_item_descrition.Location.X, textbox_item_array[0].Location.Y);

            textbox_item_array[1].Name =

string.Concat("item_description", row_count.ToString());

            panel_item_collections.Controls.Add(textbox_item_array[1]);

            textbox_item_array[2] =

new TextBox();

            textbox_item_array[2].Width = label_item_price.Width;

            textbox_item_array[2].Font = textbox_item_array[0].Font;

            textbox_item_array[2].Location =

new Point(label_item_price.Location.X, textbox_item_array[0].Location.Y);

            textbox_item_array[2].Name =

string.Concat("item_price", row_count.ToString());

            panel_item_collections.Controls.Add(textbox_item_array[2]);

            textbox_item_array[3] =

new TextBox();

            textbox_item_array[3].Width = label_item_quantity.Width;

            textbox_item_array[3].Font = textbox_item_array[0].Font;

            textbox_item_array[3].Location =

new Point(label_item_quantity.Location.X, textbox_item_array[0].Location.Y);

            textbox_item_array[3].Name =

string.Concat("item_quantity", row_count.ToString());

            panel_item_collections.Controls.Add(textbox_item_array[3]);

            textbox_item_array[4] =

new TextBox();

            textbox_item_array[4].Width = label_item_total.Width;

            textbox_item_array[4].Font = textbox_item_array[0].Font;

            textbox_item_array[4].Location =

new Point(label_item_total.Location.X, textbox_item_array[0].Location.Y);

            textbox_item_array[4].Name =

string.Concat("item_total", row_count.ToString());

            panel_item_collections.Controls.Add(textbox_item_array[4]);

            row_count++;

        }










void dynamic_text_item_code_Leave(object sender, EventArgs e)
{
    //MessageBox.Show(((Control)sender).Name.Substring(((Control)sender).Name.Length - 1, 1));
    int i;
    string name_textbox = ((Control)sender).Name;
    i = System.Convert.ToInt32(name_textbox.Substring(name_textbox.Length - 1, 1));
    //MessageBox.Show(i.ToString());
    //i--;
    TextBox[] textbox_item_array = new TextBox[5];
    textbox_item_array = (TextBox[])(item_textbox[i]);
    double item_total;
    Item item = new Item();
    //textbox_item_array[0].Leave -= dynamic_text_item_code_Leave;
    if (long.TryParse(textbox_item_array[0].Text, out item.item_code) == true)
    {
        if (item.get_item() == 0)
        {
            textbox_item_array[1].Text = item.item_details;
            textbox_item_array[2].Text = item.sell_price.ToString();
            textbox_item_array[3].Text = "1";
            item_total = System.Convert.ToInt32(textbox_item_array[3].Text) * item.sell_price;
            textbox_item_array[4].Text = item_total.ToString();
        }
    }
    else
    {
        //TextBox[] textbox_item_array = new TextBox[5];
        textbox_item_array = (TextBox[])(item_textbox[item_textbox.Count - 1]);
        panel_item_collections.Controls.Remove(textbox_item_array[0]);
        //textbox_item_array[0].Leave -= dynamic_text_item_code_Leave;
        panel_item_collections.Controls.Remove(textbox_item_array[1]);
        panel_item_collections.Controls.Remove(textbox_item_array[2]);
        panel_item_collections.Controls.Remove(textbox_item_array[3]);
        panel_item_collections.Controls.Remove(textbox_item_array[4]);
        item_textbox.RemoveAt((item_textbox.Count - 1));
        //MessageBox.Show("Deleted");
        //textbox_item_array[0].Leave -= dynamic_text_item_code_Leave;
        //MessageBox.Show(item_textbox.Count.ToString());
        row_count--;
    }
}





现在,问题是这样的:

如果用户将文本框留空,该行将被删除。奇怪的问题是:

如果按Tab键,它将执行两次离开事件处理程序。这意味着它将尝试两次删除相同的文本框,这将产生问题。谁能帮助我如何避免这种双重呼唤?



谢谢



Now, the problem is like this:
If the user leave the textbox blank, the row will be deleted. The strange problem is:
If press tab, it will execute the leave event handler twice. It means it will try to delete the same textbox twice and this will create problem. Can any one help me how to avoid this double calling?

Thanks

推荐答案

我发现某些事件处理程序可以递归调用它们(例如,更改调用该事件的项目的onchange处理程序将再次调用自身。



我声明如下:



static bool beenHere = false;



我用它如下



I have found with certain event handlers that they may be called recursively (e.g, an onchange handler that changes the item that called the event will call itself again).

I declare something like:

static bool beenHere = false;

I use it as follows

eventHandler() {

static bool beenHere = false;

 if(beenHere) {
   beenHere = false;
   return;
 }

 beenHere=true;
 /* event handler code */
 /* event handler code */
 /* event handler code */
 /* event handler code */
 return;

} // eventHandler()


这不是一个好的解决方案,但可能会阻止调用重复的同一事件。

This is not a good solution, but might prevent duplicate same events to be called.
bool leaveEventIsAlreadyCalled = false;

private void SomeMethod()
{
    if (!leaveEventIsAlreadyCalled)
    {
        leaveEventIsAlreadyCalled = true; 
        // do something
    }
    else
    {
        // do nothing
    }
}


这篇关于离开事件在C#中被多次调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆