【问题标题】:Dynamically create buttons and add events to it动态创建按钮并向其添加事件
【发布时间】:2014-02-11 22:50:46
【问题描述】:

我需要动态创建按钮(一个for循环)并在其上添加“onClick”和“doubuleClick”事件。

我是这样做的:

  Button bt = new Button();

  bt.Click += bt_Click;         
  bt.DoubleClick += bt_DoubleClick;

  private void bt_Click(object sender, EventArgs e)
  {
        label1.Text = this.Text;
  }

  private void bt_DoubleClick(object sender, EventArgs e)
  {
        //some code
  }

首先:我的“bt_Click”方法在“label1”中获取“主表单”文本。在调试器中,我看到 sender 是一个按钮。它有什么问题?

第二个:我的“bt_DoubleClick”事件完全没有反应,我这里做错了吗?

感谢任何帮助。

【问题讨论】:

    标签: c# windows-forms-designer


    【解决方案1】:

    您应该将 sender 转换为 Button 以获取 bt.Text:

    Button bt = new Button();
    bt.Click += bt_Click;
    bt.Text = "click me";
    bt.Location = new Point(100,100);
    this.Controls.Add(bt);
    
    private void bt_Click(object sender, EventArgs e)
    {
        label1.Text = (sender as Button).Text;
    }
    

    按钮对双击事件没有反应。你可以详细阅读here

    【讨论】:

    • 谢谢!第一个问题已由向 Button 发送的演员解决。我可以做些什么来即兴创作“doubleClick”吗?我需要它来制作双击打开文件夹内容的表单(如在 Windows 中)
    • 您可以使用标签或图像进行双击,恐怕您不能使用按钮。
    • 它适用于标签。标签的小问题是更难对标签进行风格化(文本旁边的图像,如窗口中的文件夹)。标签没有方法“TextImageRelation”。
    【解决方案2】:

    回答第一个问题,如果我理解正确的话,在this.Text 中,this 指的是表单,因为方法bt_Click 是Main Form 类的成员。我想你可能打算这样做:

    private void bt_Click(object sender, EventArgs e)
      {
            label1.Text = (Button)sender.Text;
      }
    

    第二:这只是 bt_Click 处理程序触发两次的情况吗?

    【讨论】:

      【解决方案3】:

      最简单的方法是使用“datagrid”。 Datagread 对所有事件和项目(图像、文本等)的组织都有很好的支持。 我已经制作了“保存”或“打开”对话框表单来浏览远程 SFTP 服务器的内容,使用 datagrad 非常容易,但我在使用按钮或标签时遇到了问题。

      【讨论】:

        猜你喜欢
        • 2012-07-08
        • 2020-03-24
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多