2009-10-07 3 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; 
     } 
    } 
} 

Таким образом, этот код работает, но только не все время. Кто-нибудь знает о каком-либо другом способе как-то отслеживать элемент управления Last-Clicked, поэтому на него можно ссылаться позже?

ответ

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; 
} 

Это стоит очень мало, чтобы сохранить ссылку, и вы можете получить доступ ссылки непосредственно.

EDIT: Изменяя ссылку на элемент управления, вы можете ссылаться на множество различных типов элементов управления без необходимости приближать тип. Причины я делаю это немного коды:

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

является это безопаснее напечатанным. Если отправитель по какой-то причине не наследует Control, то это не будет typecast, а label будет null, но исключение не будет повышаться.

У вас может быть обработчик события с одним кликом для всех элементов управления, которые вы хотите изменить, выбрав его. Это будет работать намного проще, если вы создаете элементы управления в коде и вручную подключаете события.

Возможно, вы захотите изучить какую-либо границу или эффект, чтобы показать, какой элемент управления выбран. Это может быть выполнено, делая это:

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

где Deselect и выбор сделать некоторые фантазии эффекты или границы.

Надеюсь, это поможет.

+0

спасибо кучи AP Erebus: D это было очень полезно –

+0

У меня есть один вопрос, хотя .... потому что существует множество различных типов элементов управления ... как я знаю, «какой» щелкнул, используя свой путь ? –

+0

Я не уверен, что вы спрашиваете. Если у вас есть только событие click Label, которое обрабатывается label_Click, у вас не будет проблемы с настройками других типов элементов, выбранными как SelectedLabel. Или вы ищете способ каким-то образом показать пользователю, на который была нажата метка? –

Смежные вопросы