【问题标题】:Get name of control when mouse hovers over it C#当鼠标悬停在控件上时获取控件名称 C#
【发布时间】:2012-10-22 09:00:19
【问题描述】:

我在运行时动态添加组合框,如下所示。 我遇到的问题是我不知道用户正在使用哪个组合框。

例如。用户决定在表单中添加 5 个组合框,然后转到第一个组合框,并选择一个值,我需要检索该组合框的值。

下面的代码在做什么 - 我的方法

我正在向 FlowlayoutPanel 添加一个组合框,并根据鼠标坐标检索其名称....顺便说一句,这不起作用...我不知道该怎么做。

非常感谢任何帮助。

public partial class Form1 : Form
{
    int count = 0;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        count += 1;

        ComboBox cb = new ComboBox();
        cb.Name = count.ToString();
        cb.MouseHover += new EventHandler(doStuff);

        Label lb = new Label();
        lb.Text = count.ToString();

        flowLayoutPanel1.Controls.Add(cb);
        flowLayoutPanel1.Controls.Add(lb);
    }

    public void doStuff(object sender, EventArgs e)
    {
        label1.Text = flowLayoutPanel1.GetChildAtPoint(Cursor.Position).Name;
    }
  }
}

【问题讨论】:

    标签: c# windows winforms


    【解决方案1】:

    你可以试试:

    cb.SelectionChangeCommitted += selectionChangedHandler
    
    ...
    
    void selectionChangedHandler(object sender, EventArgs e) {
      ComboBox cb = (ComboBox)sender;
      label1.Text = cb.Name;
      // Do whatever else is needed with the combo box
    }
    

    SelectionChangeCommitted event 是“仅在用户更改组合框选择时引发”,这听起来像您所追求的。

    【讨论】:

      【解决方案2】:

      在 doStuff-eventhandler 中引发事件的组合框位于 sender-parameter 中。尝试将其转换为一个复选框,如下所示:

      ComboBox boxThatRaisedTheEvent = (ComboBox)sender;

      【讨论】:

        【解决方案3】:
        string text = ((ComboBox)this.GetChildAtPoint(pt)).Text;
        

        【讨论】:

          【解决方案4】:
          public void DoStuff(object sender, EventArgs e)
          {
              var comboBox = sender as ComboBox;
              var name = (comboBox != null ? comboBox.Name : null);
          }
          

          此代码将“sender”参数转换为 ComboBox 对象,如果转换正确完成,则将 ComboBox 名称分配给字符串“name”,否则“name”为空。

          提示:C# 编码风格建议方法名称应以大写字母开头。

          【讨论】:

            【解决方案5】:

            你可以试试这样的:

            flowLayoutPanel1.Controls.OfType<ComboBox>().FirstOrDefault(cb => cb.Name.Equals(NAME_OF_COMBOBOX))
            

            或者更好:

            ComboBox box = (ComboBox)sender;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多