我有一个我正在处理的网络浏览器,目前正在添加书签。用户将能够添加和删除与他喜欢的(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]);
};
...
}