2010-07-23 51 views
3

在VB6中,您可以使用索引爲控件命名。用於VB6索引控件的C#WindowsForms等效

即:cmdStartInterval(1),cmdStartInterval(2),...。

然後你有一個方法頭是這樣的:

Private Sub cmdStartInterval_Click(Index As Integer) 
... 
End Sub 

在C#中與之相似的方式是,這也可能嗎?

+0

我猜你正在使用winforms。你可否確認? – Oded 2010-07-23 08:58:28

+0

是的,我更新了這個問題。 – Rookian 2010-07-23 08:59:35

+0

VB6總是會轉換成WinForms,因爲它在.NET中等價,它不能用於asp.net,據我所知(這將是ASP中的VBScript)。 – Abel 2010-07-23 09:01:51

回答

3

在C#中,你可以指定所有按鈕1個事件處理

protected void cmdButtons_Click(object sender, System.EventArgs e) 

當按鈕點擊此事件被稱爲,這個按鈕按發件人參數傳遞給該事件的實例。

注意(後來加入)
雖然上面是一個有效的解決問題的辦法,如果不需要索引本身優良的解決辦法的一個子集,但應注意的是,它不是一個等同如標題所暗示的那樣,但是替代。 VB6的索引控件是技術上的數組。因此,一個等價物將成爲C#中的一個數組,只能通過代碼才能達到,而不是通過設計人員。

+0

這聽起來不錯,我會嘗試這種=) – Rookian 2010-07-23 09:04:07

+0

這基本上是在VB6中所發生的事情太:被索引的所有按鈕有一個事件自動處理。 – Abel 2010-07-23 09:12:32

+0

我爲此線程的稍後訪問者添加了一點註釋,以闡明緩解的優點,但也解釋了此答案的侷限性。希望你不介意(你可以隨時切換回去)。 – Abel 2010-07-24 13:29:47

2

相當於使用控件數組。您必須手動在事件中添加索引。如果您不需要索引,則可以將事件分配給控件。

C#和VB.NET的缺點是:你不能用設計器創建索引控件,你必須手動創建它們。

好處是:這給你更多的自由。

編輯:
這是怎麼看起來:

// in your Form_Init: 

Button [] buttons = new Button[10]; // create the array of button controls 

for(int i = 0; i < buttons.Length; i++) 
{ 

    buttons[i].Click += new EventHandler(btn_Click); 
    buttons[i].Tag = i;    // Tag is an object, not a string as it was in VB6 

    // a step often forgotten: add them to the form 
    this.Controls.Add(buttons[i]); // don't forget to give it a location and visibility 
} 

// the event: 
void btn_Click(object sender, EventArgs e) 
{ 
    // do your thing here, use the Tag as index: 
    int index = (int) ((Button)sender).Tag; 
    throw new NotImplementedException(); 
} 

PS:如果你使用表單設計,每個按鍵都會有自己的名字。如果按照其他用戶的建議進行操作,即對所有用戶都使用相同的處理程序(就像在VB6中也可以這樣做),但您無法像以前那樣通過索引輕鬆區分控件。爲了克服這個問題,只需使用標籤字段。這通常是更好的而不是爲此使用名稱字段,因爲這會創建您不想要的依賴項。

+0

我的確讀過你編輯過的答案,並且我認爲你是對的。我標記的原因是正確的答案是,我仍然可以使用有用的IDE,而不是在後面的代碼中編寫所有代碼。有沒有辦法仍然使用IDE +你的「陣列方法」? – Rookian 2010-08-10 08:56:50

+0

@Rookian:不,不是直接。微軟在這裏的建議是使用設計師並給你的按鈕命名。創建一個在'form_init'中初始化的容器(類似數組的收集組件),如果你編碼的話它會自動找到你的控件。無論採用什麼方法,都不可能再給對象同名,所以無論如何,它的工作量更大(而且,看起來很奇怪,因爲它給了你更多的靈活性)。這裏的[微軟的建議,加上代碼(http://msdn.microsoft.com/en-us/library/aa289500%28VS.71%29.aspx)。 – Abel 2010-08-11 11:21:15

+0

我所採用的方法,是在委託一個事件發生的事件,並寫入正在使用的命名約定ControlName_ProviderName通用控制取景器類。我不僅具有相同含義的按鈕控件,還有Textboxes,Comboboxes等。 – Rookian 2010-08-11 16:14:28