获得选定的控制

时间:2009-10-07 12:18:08

标签: c# controls selected

我有一个“画布”(它只是一个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控件,以便稍后引用?

1 个答案:

答案 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
}

取消选择并选择执行一些奇特的效果或边框。

希望这有帮助。