我写了一个程序来设计一个Web浏览器。我把我的代码组织成了类。其实我有几个问题......
第一个问题:
要访问表单元素,我在班上使用了这个语句:
Form1 fc = (Form1)Application.OpenForms["form1"];
当我调用我使用的元素时:
fc.listboxObject.SelectedItem;
我不知道这是否正确,因为当我使用
时`Form1 f=new Form1();`
它将创建新表单,它不会更新原始表单。我将表单中的所有元素设置为公开。
第二个问题 在表单中,我必须使用线程创建新的网页窗口,以便用户可以在不同的窗口中请求多个网页。
public void start_new_page()
{
Form1 f = new Form1();
Application.Run(f);
}
private void new_page_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(start_new_page));
t.Start();
}
单击该按钮时出现以下错误: 跨线程操作无效:控制'listboxObject'从其创建的线程以外的线程访问。
我搜索了很多我使用invoke找到的解决方案,我不想使用它,因为它只会更新原始表单。我想让每个表单彼此分开但共享相同的历史列表和收藏列表。另外,我不能使用Backgroundworker。以下代码是其中一个类的方法之一,我在这里得到了错误。实际上在类的所有方法中我都面临这个错误。
public void printlistbox(string textname)
{
Form1 fc = (Form1)Application.OpenForms["form1"];
int count = 0;
string line1;
System.IO.StreamReader file1 = new System.IO.StreamReader(textname);
fc.listboxObject.Items.Clear();
while ((line1 = file1.ReadLine()) != null)
{
string[] split = line1.Split(new Char[] { '\t' });
count = 0;
foreach (string s in split)
{
if (count == 1)
fc.listboxObject.Items.Add(s);
count += 1;
}
}
file1.Close();
单击按钮打印时,将调用printlistbox函数。
答案 0 :(得分:0)
当调用'new Form()'时你应用程序在主线程上创建一些元素,当在单独的线程上调用它时你可以创建一个交叉操作尝试这样做
public void start_new_page()
{
Dispatcher.Invoke(
(Action)delegate()
{
Form1 f = new Form1();
Application.Run(f);
}, System.Windows.Threading.DispatcherPriority.Normal);
}
答案 1 :(得分:0)
你的第二个问题是最简单的......你不需要在这里手动创建新线程。这将显示一个新表单,该表单将自动拥有自己的主题。
private void new_page_Click(object sender, EventArgs e)
{
Form1 f = new Form1();
f.Show();
}
答案 2 :(得分:0)
如果您从另一个线程读取/写入表单上的对象,则必须调用。
调用示例:
private void Method1(int i)
{
if (this.InvokeRequired)
{
Invoke(new MethodInvoker(delegate() { Method1(i); }));
}
else
{
// Put your code here...
}
}