当按钮计数未知时,如何在运行时添加控件?(C#)



我有一个我正在处理的网络浏览器,目前正在添加书签。用户将能够添加和删除与他喜欢的(S)一样多的书签。该程序将在运行时检测书签量,并根据需要制作尽可能多的按钮。这是我的代码:

bookmark_url = System.IO.File.ReadAllLines(@"C:UsersPublicIAmAPerson_Web_Explorerbookmarksbookmarks.txt");
bookmark_names = System.IO.File.ReadAllLines(@"C:UsersPublicIAmAPerson_Web_Explorerbookmarksbookmark_names.txt");
for (int i = 0; i < bookmark_url.Length; i++)
{
     Button button = new Button();
     button.Left = i * 75 + 9;
     button.Top = 50;
     button.Text = bookmark_names[i];
     this.Controls.Add(button);
     button.Click += (sender, e) =>
     {
         webBrowser1.Navigate(bookmark_url[i]);
     };
     Controls.Add(button);
}

一切正常,可以单击按钮的响应。当我单击任何按钮时,该代码会引发外部异常。例外情况发生在以下线上:

webBrowser1.Navigate(bookmark_url[i]);

有人可以帮我解决我的问题吗?就像我说的那样,其余的代码正常工作,直到我单击按钮为止。

另外,我尝试将有缺陷的代码线放入尝试... catch语句中,但随后它没有做任何事情(可能是因为它不断投掷异常)。看起来这样的代码:

try
{
    webBrowser1.Navigate(bookmark_url[i]);
}
catch (Exception)
{
}

,为了防止这一点被标记为重复,我看了,我确实找到了其他问题,但是所有这些问题都知道他们将拥有多少按钮。此代码直到读取文件才知道。

编辑:以下信息可能会有所帮助 - 我正在使用VS Express 2012中的Windows表单。

这是修改后的闭合情况。当for循环运行时,变量i的最终值是bookmark_url.Length。由于" for"循环的问题,i的最终值都在您的所有Click事件中存储。然后,当您单击任何按钮时,它正在尝试从不存在的文本文件中获取一行。

i存储在循环中的温度变量中,然后在Click事件中分配临时变量:

for (int i = 0; i < bookmark_url.Length; i++)
{
    var iTmp = i;
    ...
    button.Click += (sender, e) =>
    {
        webBrowser1.Navigate(bookmark_url[iTmp]);
    };
    ...
}

最新更新