【问题标题】:Creating controls on runtime - pass data在运行时创建控件 - 传递数据
【发布时间】:2016-07-18 18:59:31
【问题描述】:

在 Windows 窗体项目中,我有这种方法来设置动态创建的控件的一些属性。在这种情况下,当用户将鼠标悬停在它上面时,我还需要显示一个工具提示。这工作正常,除了一件事,我不知道如何将 w["text"] 的值传递给 control_MouseEnter。

private void SetProp(ref Control obiekt, Dictionary<string, string> w)
    {
        obiekt.Name = w["id"];
        obiekt.Location = new Point(Convert.ToInt16(w["wspx"]), Convert.ToInt16(w["wspy"]));
        obiekt.Height = Convert.ToInt16(w["wys"]);
        obiekt.Width = Convert.ToInt16(w["szer"]);
        if (w["text"] != "")
        {
            obiekt.MouseEnter += new EventHandler(control_MouseEnter);
            obiekt.MouseLeave += new EventHandler(control_MoouseLeave);
        }
    }

private void control_MouseEnter(object sender, EventArgs e)
    {
        toolTip.Show("how to pass a value here ??", (Control)sender, 5000);
    }

【问题讨论】:

    标签: c# .net events dynamic controls


    【解决方案1】:

    我不知道必须将 w["text"] 的值传递给 control_MouseEnter。

    您可以直接(例如通过 Control.Tag 属性)或间接(例如通过全局变量/字典)将您的数据与目标控件链接,或者使用匿名委托和闭包来创建本地数据上下文:

    obiekt.MouseEnter += (s,e) => { 
        tooltip.Show(w["text"], (Control)s, 5000);
    };
    

    有没有办法以某种方式使用 EventArgs?

    不,你不能。因为 args 正是在鼠标事件发生的那一刻在 Control 的代码中实例化的,您无法从事件订阅点控制 EventArgs 的创建。

    【讨论】:

    • 这似乎是一个不错的解决方案。谢谢。
    【解决方案2】:

    如何将文本设置为Control 对象的Tag 成员?

    某事。喜欢 object.Tag = w["text"]; 并使用事件处理程序显示它

    【讨论】:

    • 谢谢,这实际上按预期工作。那是唯一的解决方案吗?有没有办法以某种方式使用 EventArgs ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多