【问题标题】:C# dynamically add button and send event args with itC#动态添加按钮并用它发送事件参数
【发布时间】:2012-07-17 12:16:34
【问题描述】:

我想答案很简单,但我找不到...

我有一个这样编程的列表视图:

ListView board = new ListView();

board.Bounds = new Rectangle(new Point(0, 0), new Size(this.Width, this.Height));

board.View = View.Details;
board.LabelEdit = false;
board.AllowColumnReorder = false;
board.GridLines = true;

//textPieces 0 = Van 1 = Titel 2 = Ontvangen 3 = groote

board.Columns.Add(" Afzender ", -10, HorizontalAlignment.Center);
board.Columns.Add(" Titel ", -10, HorizontalAlignment.Center);
board.Columns.Add(" Ontvangen ", -10, HorizontalAlignment.Center);
board.Columns.Add(" Groote ", -10, HorizontalAlignment.Center);
board.Columns.Add(" Bekijken ", -10, HorizontalAlignment.Center);

for (int c = 0; c < new_message_counter; c++)
{
    ListViewItem item = new ListViewItem(berichten_verzameling[c, 0], 0);
    item.SubItems.Add(berichten_verzameling[c, 1]);
    item.SubItems.Add(berichten_verzameling[c, 2]);
    item.SubItems.Add(berichten_verzameling[c, 3]);
    Button dynamicbutton = new Button();
    dynamicbutton.Text = "Bekijk dit bericht";
    dynamicbutton.Name = "show_all_number_" + c;
    item.SubItems.Add(dynamicbutton);
    board.Items.Add(item);
}

groupBox1_all_message.Controls.Add(board);

正如你们中的一些人可能已经看到的那样,有一个错误......因为这不起作用:( item.SubItems.Add(dynamicbutton);)

所以我的第一个问题是如何在其他信息的同一行显示按钮。

另外,我怎样才能动态地为所有这些按钮创建一个事件处理程序,并用它发送一些参数...

就像在 html / javascript 中一样:

<button OnClick="DoStuff(5,true);">do it!</button>

但是如何在 C# 中做到这一点?

提前致谢 TWC废话

【问题讨论】:

  • 抱歉,我正在使用 Windows 窗体应用程序... :D

标签: c# winforms listview event-handling


【解决方案1】:

第一个问题

How would you add a button onto standard winform listview control

由于listview(或listviewitem)不能用作容器,因此无法直接添加控件。您可能需要寻找自定义方法/扩展功能。看文章中的ListViewExtender How to add button into a listview in winforms

第二个问题

  How to make event handler to the button and add event argument to it

一旦你使用了ListViewExtender,你就可以使用自定义的ListViewColumns来获取listviewitem子文本的参数。您不需要从 UI 传递参数

dynamicbutton.Click += OnButtonActionClick();

 private void OnButtonActionClick(object sender, ListViewColumnMouseEventArgs e)
{
    // you clicked the button.
    MessageBox.Show("your current listviewItem - " - e.SubItem.Text)
}

【讨论】:

  • 给winform加个按钮比较容易,在listview控件上面加个按钮就需要做一些工作了。如果是这样的话,你不能在列表视图的底部添加一个按钮,当你点击按钮时你可以得到selectedlistviewitem
【解决方案2】:

试试这个

    Button dynamicbutton = new Button();
    dynamicbutton.Command += new CommandEventHandler(dynamicbutton_Command);
    dynamicbutton.CommandName = "myCommandName";
    dynamicbutton.CommandArgument = anyID;

void dynamicbutton_Command(object sender, CommandEventArgs e)
{
   // do stuff
}

也可以试试这个添加你的按钮

item.Controls.Add(dynamicbutton);

【讨论】:

  • 看起来不错,但是当我使用它时,出现此错误:错误 1 ​​找不到类型或命名空间名称“CommandEventArgs”(您是否缺少 using 指令或程序集引用?)
  • dynamicbutton.Click += new EventHandler(dynamicbutton_Click);
  • void dynamicbutton_Click(object sender, EventArgs e)
  • 好吧,我现在有了这个:dynamicbutton.Name = "myCommandName";动态按钮.CommandArgument = c; item.SubItems.Add(动态按钮);但是 this(CommandArgument ) 也无效。而且我一直在寻找替代方案,但无法想出一个。那么我必须使用什么?而这一行: item.Controls.Add(dynamicbutton);给控制部分同样的问题....
  • 我认为 CommandName/Arugment 只出现在 WPF 中,在 winform 世界中找不到...
【解决方案3】:

好吧,这是第 2 部分,您可以将“Click”事件绑定到 do.. 循环中的事件处理程序。 (例如 button.Click += {event})

第 1 部分 => 我认为此链接会对您有所帮助:Adding button into a Listview in WinForms

【讨论】:

    【解决方案4】:

    λ

    dynamicButton.Click += (sender, e) => {
        // ...
    }
    

    完整签名

    dynamicButton.Click += ClickEventCallback;
    
    private void ClickEventCallback(object sender, EventArgs e) {
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-24
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多