一个主窗体A,里面放置了一个文本框,读取的是本地文本文件,有一个菜单功能是信息替换,点击这个功能菜单时候弹出替换信息窗体B,当在B窗体中输入替换信息并且点击确定时,B窗体关闭,主窗体A中的文本框怎样才能更新?是否必须重新读取本地文件?注:在主窗体A中点击替换信息功能菜单时候主窗体不关闭,在B窗体中点击确定按钮时候B窗体关闭!

解决方案 »

  1.   

    不明白什么意思?
    举个例子:
    窗体A:
    txt.Text="读取文件"
    frmB frm=new frmB();
    frm.show(this);
    窗体A获取替换字符方法:
    public void s(string s)
    {
    string ss=txt.Text;
    txt.Text=ss+s;
    }
    窗体B:
    string s="替换信息";
    this.owner.s(s);
      

  2.   

    在a窗口中写个public的方法,用于更新。。比如。。        public void ChangeText(string s)
            {
                richTextBox1.Text = s;
            }然后b窗口增加一个带参数的构造方法,参数为窗口a。。弹出b窗口的时候把a窗口传过去。。            Form2 f2 = new Form2(this);
                f2.Show();然后在b窗口中必要的时刻调用a的更新方法。。f1.ChangeText("123");
      

  3.   

    最简单的方法,直接传递控件// 在窗体B中声明
    TextBox rpcEdit;public FormB (TextBox textBox)
    {
        this.rpcEdit = textBox;
    }// 然后利用正则 Regex 替换文本
    Regex.Replace(this.rpcEdit.Text, "...", "...");
      

  4.   

    这段程序的要求是这样的:本地磁盘有一个aa.txt文本文件,A窗体中放置一个文本框并且里面写了一个方法,用来读取aa.txt里面的内容,并将读出来的内容赋值给文本框的.Txt属性,当点击A窗体的替换信息按钮时弹出B窗体,在B窗体中可以做的事情是:点击确定按钮要把aa.txt中的某个字如“AA”替换为“BB”,然后把替换后的信息重新保存到aa.txt中。问题就出来了:替换后A窗体中的文本框不能显示更新,必须把文本框关闭再重新打开,才能显示替换后的信息。这个问题怎样解决?
      

  5.   

    传递 TextBox,传递 Form 豆可以解决楼主您的问题。。
      

  6.   

    不太明白,你替换后的内容可以从写进aa.txt文本,文本框里面的内容从新赋值就可以了
      

  7.   

    试过了,传递Form。没有实现,谢过……
      

  8.   

    是的,是重新写进aa.txt中的,但是重新赋值,不是还要重新读取吗?重新读取,怎样实现呢?目前为止我只能重新加载窗体……
      

  9.   

    重新赋值非得重新读取么?。。既然你将B窗体中的文本写入txt文件,然后再将txt文件中的文本重新读取出来赋值给A窗体的控件。。那何不如直接将B窗体中的文本直接赋值给A窗体?。。
    如果非得实现重新读取的话,把读取的部分写到一个public的方法中,然后把A对象送给B,有了对象有了public的方法,执行这个方法还不容易么。。
      

  10.   

    文本框是动态生成的,可能不止一个,信息替换之后必须重新写入。不过你说的把A对象传送给B是不是在A窗体中这样写:B b=new B();
              b.Show(this);
    如果这样没错的话,下面B窗体中直接调用A窗体的赋值方法,
    FormA frm=new FormA();
    frm.setmessage("这里是路径");
    这样理解没错的话,是实现不了的。已经试过了……再次谢过……
      

  11.   

    下面是B窗体代码: public void readMessage()
            {
                StreamReader st = new StreamReader("..\\..\\SpaceUrl.rec");
                string LocalFolderPath = st.ReadToEnd();
                st.Close();
                Main min = new Main();
                if (LocalFolderPath != string.Empty)
                {
                    DirectoryInfo dir = new DirectoryInfo(LocalFolderPath + "\\" + _itemName);
                    FileInfo[] files = dir.GetFiles("*.rec", SearchOption.AllDirectories);
                    try
                    {
                        foreach (FileInfo dChild in files)
                        {
                            using (StreamReader reader = new StreamReader(dChild.FullName.ToString(), Encoding.UTF8))
                            {
                                string strburider = reader.ReadToEnd();
                                reader.Close();
                                if (strburider.IndexOf(txtOld.Text.ToString()) > -1)
                                {
                                    string t = ReplaceIgnoreCase(strburider,  txtOld.Text, txtNew.Text);
                                    using (StreamWriter writer = new StreamWriter(dChild.FullName.ToString(), false))
                                    {
                                        writer.Write(t);
                                        writer.Close();
                                        //下面这步是调用A窗体读取信息方法,传过去的是一个路径
                                        min.Read_Text(dChild.FullName.ToString());
                                        this.Close();
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
    这是A窗体:里面的方法--传过去对象   private void 信息替换ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                TreeNode nodes = TreeShow.SelectedNode;
                BLL.FileWord fileword = new WpAuto.BLL.FileWord();
                TreeNode itemName = fileword.GetItemName(nodes);            ReplaceMessage replaceMessage = new ReplaceMessage();
                if (itemName != null)
                {
                    replaceMessage._itemName = itemName.Text;
                    replaceMessage.Show(this);
                }
            }下面是A窗体里面的方法:给文本框赋值
      public RichTextBox Read_Text(string str)
            {
                StreamReader st = new StreamReader(str);
                RichTextBox rich = new RichTextBox();
                rich.Dock = DockStyle.Fill;
                rich.Size = new Size(284, 248);
                rich.Text = st.ReadToEnd();
                st.Close();
                return rich;
            }
      

  12.   

    您理解错了。。
    传递对象a应该用带参数的构造方法去传递,B b=new B(this);,Show方法本身并没有参数,当然你重载也可以实现。。
    然后最主要的问题就是对传递过来的a对象的调用。。
    FormA frm=new FormA();这样做是新生成一个A窗体,而并不是当前已经显示的那个。。
    必须在B类中设一个字段,然后在构造方法中用这个字段去保存传过来的a对象。。
    A aInB;
    public B(A a)
    {
        aInB = a;
    }
    然后调用是用 aInB 这个对象去调用,比如 aInB.setmessage()。。
    至于A中控件是动态生成的,个人感觉这个不会是阻碍。。
      

  13.   

    使用event, 在B中定义一个事件,如event EventHandler TextModified;然后在A中订阅这个事件
    B.TextModified += new EventHandler( B_TextModified );在方法B_TextModified 中更新A里的控件,当B操作完成后发送TextModified消息
      

  14.   

    在FormA 中这样写:
    FormB frmb=new FormB(this);
          frmb.show();
    在FromB中这样写:
    FormA frma;
    public void FormA(FormA a)
    {
     frma=a;
    }
    然后调用frma.setmessage()……
    是这样吗?
    似乎还不对,方法能过实例化吗?B b=new B(this);,是什么意思?
    是实例化FormB?还是FormB中的方法
      

  15.   

    什么是构造方法,什么又带参数的构造方法。。在FromB中这样写:
    FormA frma;
    public void FormA(FormA a)
    {
     frma=a;
    }这样要改为在FromB中这样写:
    FormA frma;
    public FormB(FormA a)
    {
     frma=a;
    }