一个简单的问题 一个主窗体A,里面放置了一个文本框,读取的是本地文本文件,有一个菜单功能是信息替换,点击这个功能菜单时候弹出替换信息窗体B,当在B窗体中输入替换信息并且点击确定时,B窗体关闭,主窗体A中的文本框怎样才能更新?是否必须重新读取本地文件?注:在主窗体A中点击替换信息功能菜单时候主窗体不关闭,在B窗体中点击确定按钮时候B窗体关闭! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不明白什么意思?举个例子:窗体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); 在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"); 最简单的方法,直接传递控件// 在窗体B中声明TextBox rpcEdit;public FormB (TextBox textBox){ this.rpcEdit = textBox;}// 然后利用正则 Regex 替换文本Regex.Replace(this.rpcEdit.Text, "...", "..."); 这段程序的要求是这样的:本地磁盘有一个aa.txt文本文件,A窗体中放置一个文本框并且里面写了一个方法,用来读取aa.txt里面的内容,并将读出来的内容赋值给文本框的.Txt属性,当点击A窗体的替换信息按钮时弹出B窗体,在B窗体中可以做的事情是:点击确定按钮要把aa.txt中的某个字如“AA”替换为“BB”,然后把替换后的信息重新保存到aa.txt中。问题就出来了:替换后A窗体中的文本框不能显示更新,必须把文本框关闭再重新打开,才能显示替换后的信息。这个问题怎样解决? 传递 TextBox,传递 Form 豆可以解决楼主您的问题。。 不太明白,你替换后的内容可以从写进aa.txt文本,文本框里面的内容从新赋值就可以了 试过了,传递Form。没有实现,谢过…… 是的,是重新写进aa.txt中的,但是重新赋值,不是还要重新读取吗?重新读取,怎样实现呢?目前为止我只能重新加载窗体…… 重新赋值非得重新读取么?。。既然你将B窗体中的文本写入txt文件,然后再将txt文件中的文本重新读取出来赋值给A窗体的控件。。那何不如直接将B窗体中的文本直接赋值给A窗体?。。如果非得实现重新读取的话,把读取的部分写到一个public的方法中,然后把A对象送给B,有了对象有了public的方法,执行这个方法还不容易么。。 文本框是动态生成的,可能不止一个,信息替换之后必须重新写入。不过你说的把A对象传送给B是不是在A窗体中这样写:B b=new B(); b.Show(this);如果这样没错的话,下面B窗体中直接调用A窗体的赋值方法,FormA frm=new FormA();frm.setmessage("这里是路径");这样理解没错的话,是实现不了的。已经试过了……再次谢过…… 下面是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; } 您理解错了。。传递对象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中控件是动态生成的,个人感觉这个不会是阻碍。。 使用event, 在B中定义一个事件,如event EventHandler TextModified;然后在A中订阅这个事件B.TextModified += new EventHandler( B_TextModified );在方法B_TextModified 中更新A里的控件,当B操作完成后发送TextModified消息 在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中的方法 什么是构造方法,什么又带参数的构造方法。。在FromB中这样写:FormA frma;public void FormA(FormA a){ frma=a;}这样要改为在FromB中这样写:FormA frma;public FormB(FormA a){ frma=a;} 用遥控的方式(类似电视)实现电脑关机控制 重新提问 MS Media 编码器 SDK GridView的问题。 c#中点击一个combobox的时候另一个combobox要禁止输入 初学C#画图,为什么不显示图片,请大家帮忙看下! 关于得到歌曲总时间 请问一个关于窗口传递数值的问题 c# 继承 疑惑求解答。 c代码转换成c#代码的问题 数据库图片存取 送分贴..一个简单问题
举个例子:
窗体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);
{
richTextBox1.Text = s;
}然后b窗口增加一个带参数的构造方法,参数为窗口a。。弹出b窗口的时候把a窗口传过去。。 Form2 f2 = new Form2(this);
f2.Show();然后在b窗口中必要的时刻调用a的更新方法。。f1.ChangeText("123");
TextBox rpcEdit;public FormB (TextBox textBox)
{
this.rpcEdit = textBox;
}// 然后利用正则 Regex 替换文本
Regex.Replace(this.rpcEdit.Text, "...", "...");
如果非得实现重新读取的话,把读取的部分写到一个public的方法中,然后把A对象送给B,有了对象有了public的方法,执行这个方法还不容易么。。
b.Show(this);
如果这样没错的话,下面B窗体中直接调用A窗体的赋值方法,
FormA frm=new FormA();
frm.setmessage("这里是路径");
这样理解没错的话,是实现不了的。已经试过了……再次谢过……
{
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;
}
传递对象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中控件是动态生成的,个人感觉这个不会是阻碍。。
B.TextModified += new EventHandler( B_TextModified );在方法B_TextModified 中更新A里的控件,当B操作完成后发送TextModified消息
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中的方法
FormA frma;
public void FormA(FormA a)
{
frma=a;
}这样要改为在FromB中这样写:
FormA frma;
public FormB(FormA a)
{
frma=a;
}