我有一个“画布”(它只是一个Panel Control),用户可以点击按钮向画布添加某些控件,即标签,链接标签,图像等......然后他们可以编辑这些控件,就像他们可以编辑他们刚刚添加的标签文本一样......
但是我试图让他们为他们点击的控件选择一种新字体和一种新颜色,但它并不总是有效,即使它应该是......
我的代码是:
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控件,以便稍后引用?
答案 0 :(得分:3)
而不是存储字符串名称,为什么不存储对最后一次单击控件本身的引用?
所以你的代码变成了:
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继承,那么它将不是类型转换而label将为null,但不会引发异常。
您可以为所有希望通过选择更改的控件设置单击事件处理程序。如果您在代码中创建控件并手动挂接事件,这将更容易。
您可能需要查看做一些边框或效果以显示已选择哪个控件。 这可以通过以下方式执行:
if(ctrl != null)
{
Deselect(SelectedControl); //Deselects the old control
SelectedControl = ctrl;
Select(SelectedControl); //Selects the new control
}
取消选择并选择执行一些奇特的效果或边框。
希望这有帮助。