3

我写了一个程序来设计一个网络浏览器。我将我的代码组织成类。其实我有几个问题...

第一个问题:

为了访问表单元素,我在课堂上使用了这个语句:

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”从创建它的线程以外的线程访问。

我搜索了很多使用调用找到的解决方案,但我不想使用它,因为它只会更新原始表单。我想让每个表单彼此分开,但共享相同的历史列表和收藏列表。另外,我不能使用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 函数。

4

3 回答 3

0

如果您从不同的线程读取/写入表单上的对象,则必须调用。

调用示例:

private void Method1(int i)
{
  if (this.InvokeRequired)
  {
    Invoke(new MethodInvoker(delegate() { Method1(i); }));
  }
  else
  {
    // Put your code here...
  }
}
于 2013-10-24T16:45:07.673 回答
0

当调用'new Form()'时,你应用程序在主线程上创建一些元素,在单独的线程上调用它时,你可以创建一个交叉操作尝试这样做

   public void start_new_page()
   {
        Dispatcher.Invoke(
              (Action)delegate()
        {
             Form1 f = new Form1();
             Application.Run(f);
        }, System.Windows.Threading.DispatcherPriority.Normal);
    }
于 2013-10-24T12:45:43.970 回答
0

你的第二个问题是最简单的......你不需要在这里手动创建新线程。这将显示一个新表单,该表单将自动拥有自己的线程。

private void new_page_Click(object sender, EventArgs e)
{
   Form1 f = new Form1();
   f.Show();
}
于 2013-10-24T12:50:06.087 回答