2009-10-07 71 views
1

我有一個「畫布」(它只是一個面板控件),用戶可以點擊一個按鈕來添加某些控件到畫布上,例如標籤,鏈接標籤,圖片等......然後他們可以編輯這些控件,就像他們可以編輯他們剛剛添加的標籤的文本一樣......獲取選定的控件

但是我試圖讓他們爲他們點擊的控件選擇一種新的字體和一種新顏色,但它並沒有「噸總是工作,即使它應該是...

的代碼,我是:

private string SelectedControl; 

當我點擊控制:

private void label_Click(object sender, EventArgs e) 
{ 
    Label label = (Label)sender; 
    SelectedControl = label.Name; 
} 

當用戶選擇的字體:

private void setfont() 
{ 
    foreach(Control control in Canvas.Controls) 
    { 
     if(control.Name == SelectedControl) 
     { 
      control.Font = selectedfont; 
     } 
    } 
} 

因此,此代碼的工作,但只是不是所有的時間。有沒有人知道以其他方式跟蹤最後點擊的控件,以便稍後可以引用它?

回答

2

而不是存儲字符串名稱,爲什麼不存儲對最後點擊的控件本身的引用?

使你的代碼變成:

private Control SelectedControl; 

private void label_Click(object sender, EventArgs e) 
{ 
    Control ctrl = sender as Control; 
    if(ctrl != null) 
     SelectedControl = ctrl; 
} 

private void setfont() 
{ 
    SelectedControl.Font = selectedfont; 
} 

它的費用非常少的存儲參考,您可以直接訪問參考。

編輯:通過更改引用作爲控件,您可以引用許多不同類型的控件,而不必四處亂竄。 我這段代碼的原因:

Control ctrl = sender as Control; 
if(ctrl != null) 
     SelectedControl = ctrl; 

是它是一個更安全的類型轉換。如果發送者出於某種原因不從Control繼承,那麼它將不會被強制轉換,並且標籤將爲空,但不會引發異常。

對於想要通過選擇可以更改的所有控件,您可以有一個單擊事件處理程序。如果您在代碼中創建控件並手動連接事件,這將更容易。

您可能想要考慮做一些邊界或效果來顯示哪個控件已被選中。 這可以通過這樣進行:

if(ctrl != null) 
{ 
    Deselect(SelectedControl); //Deselects the old control 
    SelectedControl = ctrl; 
    Select(SelectedControl); //Selects the new control 
} 

,其中取消和選擇做一些奇特的效果或邊界。

希望這會有所幫助。

+0

謝謝你堆AP Erebus:D這是非常有幫助 – 2009-10-07 12:27:46

+0

我雖然有一個問題,因爲有很多不同類型的控制...我怎麼知道'哪一個'是通過使用你的方式點擊? – 2009-10-07 12:35:52

+0

我不確定你的問題。如果您只有Label的點擊事件由label_Click處理,那麼您將不會將其他類型的控件設置爲SelectedLabel。 或者你正在尋找一種方式來顯示用戶哪個標籤被點擊? – 2009-10-07 12:50:15

相關問題