为不在事先存在的按钮创建操作

时间:2014-01-09 09:38:49

标签: c# wpf button

如果事先没有创建按钮,是否可以创建与_Click操作关联的名称?这有点难以解释,但我认为在浏览我的代码时会更清楚:

index = Array.FindIndex(bookmarks, i => i == null || i.Length == 0); //find closest empty spot in array
bookmarks[index] = "http://" + Urlbox.Text;
book[index] = new Button();
book[index].Height = 31;
book[index].Content = bookmarks[index];
book[index].Click += book[index]_Click;
Bookbar.Items.Add(book[index]);

我的方法如下:

public void book[index]_Click(object sender, RoutedEventArgs e)
{

    WebBrowser1.Navigate("random url");
}

正如您所看到的,在我尝试向其添加操作之前,我的按钮是以编程方式创建的。但是,我在创建我的操作的行下面得到了错误的错误Error 1 ; expected虽然,将该行更改为book[index].Click += Bookmark_Click;预先Bookmark所在的位置现有按钮似乎正常工作。

我使用数组的原因是我想创建多个按钮并为每个按钮分别执行不同的_Click操作。我究竟做错了什么?

3 个答案:

答案 0 :(得分:2)

你不能写

book[index].Click += book[index]_Click;

语法错误。

您需要为所有按钮准备一个处理程序,并使用sender参数来区分它们。 例如:

void buttonBook_Click(object sender, EventArgs e)
{
    // implementation...
}

您必须按如下方式注册此处理程序:

book[index].Click += buttonBook_Click;

答案 1 :(得分:2)

首先,您不能在方法名称中使用[],这是您的错误。

然而,根据您正在做的事情,每个按钮只是导航到不同的URL。这不是一个不同的操作,只是一个参数化的操作。

有几种方法可以解决这个问题,最简单的方法是将网址拉回按钮

public void book_Click(object sender, RoutedEventArgs e)
{
  // since we copied this already
  WebBrowser1.Navigate(new Uri(((Button)sender).Content));
}

或者你也可以使用匿名方法,这依赖于一个闭包(在创建匿名方法时捕获index)。

book[index].Click += (sender, e) { WebBrowser1.Navigate(bookmarks[index]); };

答案 2 :(得分:0)

问题是book[index]_Click是不正确的方法名称,因此您不能将其用作事件处理程序。您可以改为使用匿名函数:

book[index].Click += (s, r) { WebBrowser1.Navigate("random url"); };