作者tramp ( )
看板C_Sharp
標題[問題] 關於button.click
時間Tue Mar 10 01:49:58 2009
只設定了一個button和TextBox
分別在按下鍵盤X Y Z的時候會出現
我想要讓我可以分別輸入X Y Z的值
程式碼如下
//這邊是當按下X Y Z的時候 會設定dim為何 (ex:X的話dim就是1)
//然後去跑DataReal這個函數
if ((int)(byte)e.KeyCode == 'X')
{
dim = 1;
this.DataReal();
}
if ((int)(byte)e.KeyCode == 'Y')
{
dim = 2;
this.DataReal();
}
if ((int)(byte)e.KeyCode == 'Z')
{
dim = 3;
this.DataReal();
}
//宣告button和textbox 以及 字串Xw Yw Zw
TextBox tb = new TextBox();
System.Windows.Forms.Button b = new System.Windows.Forms.Button();
String Xw,Yw,Zw;
public void DataReal()
{
//將tb和b加入到controls底下
this.Controls.Add(tb);
this.Controls.Add(b);
//這邊是button按下時候的反應呼叫
this.b.click += new System.EventHandler(this.OnButton);
}
//底下是按下button之後的反應
private void OnButton(object sender, System.EventArgs e)
{
switch (dim)
{
case 1:
Xw = tb.Text;
//將tb中的字串丟給Xw
break;
case 2:
Yw = tb.Text;
break;
case 3:
Zw = tb.Text;
break;
default :
break;
}
//然後這是我測試效果的地方
Console.WriteLine("Xw: " + Xw);
Console.WriteLine("Yw: " + Yw);
Console.WriteLine("Zw: " + Zw);
Console.WriteLine("");
//清除掉tb中的字串 為了讓下一次輸入時是空白
tb.Clear();
//因為某些原因 我必須要把button和textbox先隱藏起來
this.Controls.Remobe(b);
this.Controls.Remove(tb);
}
我的操作過程是這樣的
當我按下了X 則會出現button和textbox
此時例如我輸入了123然後按下button
那console會寫下
Xw:123
Yw:
Zw:
並且button和textbox都消失
這個時候我再按下Y button和textbox會再出現
假設我輸入了456然後按下button
那console會寫下
Xw:123
Yw:456
Zw:
Xw:123
Yw:
Zw:
會跑兩次OnButton
且原本是為了方便讓我不用每次按backspace把textbox中的值清除的
b.clear()
反而把Y的值清掉了 (因為清除掉了 Yw又讀了一次 於是Yw變成null)
若再進行Z 輸入789
則會是
Xw:123
Yw:
Zw:789
Xw:123
Yw:
Zw:
Xw:123
Yw:
Zw:
變成執行了三次
以此類推下去
個人估計是因為再寫button按下的反應的時候
b.click
+= new System.EventHandler(this.OnButton)
其中的+=造成程式一直累加讀取this.OnButton的次數
請問板上各位大大
這個問題該如何解決?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.44.27
→ tramp:自問自答...因為每次呼叫DataSave的時候,都會進行一次 03/10 10:08
→ tramp:this.Controls.Add(b); 所以b.Click += 好像就會被累加上去 03/10 10:09
→ tramp:所以後來再OnButton的地方增加一個只做一次的限制就好了 03/10 10:10
推 help0430:你在NEW BUTTON的地方直接加上事件不就好了~ 03/10 10:14
→ help0430:不用在DATAREAL裡加阿 03/10 10:15
→ tramp:推文第一行打錯 是DataReal 03/10 10:34
→ tramp:感謝help大~~ 03/10 11:34