C# 在窗体A上用ShowDialog打开B窗体后,如何在B窗体上操作A窗体上的控件?

窗体A上写代码:Bmyform=newB();myform.ShowDialog();问,我如何在B窗体上操作A窗体上的控件?... 窗体A上写代码:
B myform = new B();
myform.ShowDialog();

问,我如何在B窗体上操作A窗体上的控件?
展开
 我来答
高金山
推荐于2016-03-13 · TA获得超过1万个赞
知道大有可为答主
回答量:4101
采纳率:0%
帮助的人:1646万
展开全部
方法1:使用窗体的Owner属性
步骤 1)在窗体A呼叫窗体B之前,将窗体A赋予窗体B,即 fasSet.Owner = this;表示fasSet(窗体B)拥有窗体A,如下面代码:
/// <summary>
/// 呼叫窗体B
/// </summary>
void WakeUpForm()
{
FmAlarmSet fasSet = new FmAlarmSet();
//将本窗体设为“设置窗体”所有
fasSet.Owner = this;
fasSet.ShowDialog();
}
步骤 2)在窗体B中实例化窗体A,这样窗体B就可以操作窗体A了。如下代码
//得到传入的FmAlarm窗体值
FmAlarm fa = (FmAlarm)this.Owner;

//循环查找FormA中的控件,然后变更控件中的值
foreach (Control con in fa.Controls)
{
if (con.Name == "txtAlarmContent")
{
((TextBox)con).Text = txtAlarmContent.Text;
}
}

方法2:将窗体A作为控件传入窗体B
步骤:1)修改窗B的构造函数,加入参数,类型为窗体A
/// <summary>
/// 窗体A变量,定义为全局变量,便於调用
/// </summary>
FmAlarm fa = null;

public FmAlarmSet(FmAlarm FmA)
{
InitializeComponent();
fa = FmA;
}
步骤:2)在窗体 A呼叫窗体方法的参数中加入自己,把自己传给窗体B。
/// <summary>
/// 呼叫窗体B
/// </summary>
void WakeUpForm()
{
FmAlarmSet fasSet = new FmAlarmSet(this);
fasSet.ShowDialog();
}
步骤:3)在需要地方调用窗体A即可,如下代码,改变窗体A中TextBox中的值。
//循环查找FormA中的控件,然后变更控件中的值
foreach (Control con in fa.Controls)
{
if (con.Name == "txtAlarmContent")
{
((TextBox)con).Text = txtAlarmContent.Text;
}
}
fancyivan
2008-09-19 · TA获得超过837个赞
知道小有建树答主
回答量:633
采纳率:0%
帮助的人:430万
展开全部
方法有三个:
1.在ShowDialog时,将要在B窗体上操作A窗体的那个控件的对象做为参数传递给B窗体,如,有个lblA要操作,则先在B窗体中定义: Label lblB; 在B类的构造函数里加入: lblB = lblA;

然后,B myform = new B(lblA); myform.ShowDialog();
这时在B里操作lblB就相当于操作lblA,没有区别.

2.在ShowDialog时,将其父窗体的对象传递给子窗体: ShowDialog(this);
然后在子窗体里定义一个父窗体的对象,如: FormA frma;
然后在B窗体用到A窗体这个对象的时候,或者为简单起见,直接在B窗体的onshow事件里加入: frma = (FormA)this.owner; //即将传过来的owner转为FormA类型.

然后,就可以调用A窗体上的控件了.

3.新建第三个文件: c.cs文件, 此对象和里面的方法都可以是静态的.在其中定义一个控件对象,或者hashtable,或者arraylist等,总之用于存要操作的控件的地方.然后在new B窗体之前, A先将要操作的控件放在c.cs中的相应的地方. B窗体也直接去读c.cs中的相应对象就可以了. 不过这里就涉及到一个例外处理的情况,比如如果A在new B前忘了把控件对象放进去,怎么处理等.

bless
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
aideqiuqian7
2008-09-19 · TA获得超过648个赞
知道小有建树答主
回答量:417
采纳率:0%
帮助的人:309万
展开全部
打开designer.cs类型的文件,将要操作的控件private改为public,
这么做不好的地方就是不稳定,不太安全,还有就是通过数据库的数据通过传递数据来操作控件的值或者属性。。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
aaronchan_chn
2008-09-20
知道答主
回答量:42
采纳率:0%
帮助的人:0
展开全部
可以使用事件委托来做的
在B窗体中写下如下代码:
//第一步 ,定义委托,且无返回值
public delegate void BEventHandler(object sender, EventArgs e);
//第二步 ,定义事件委托变量
public event BEventHandler bDelegate = null;
//B窗体Button对应的事件
private void m_bButton_Click(object sender, EventArgs e)
{
//判断委托变量不为空,即已引用了方法
if (bDelegate != null)
{ //第四步,触发事件,使用委托
bDelegate(object sender, EventArgs e);
}
}
第三步是在A窗体中做的,在A窗体中写到:
private void m_AButton_Click(object sender, EventArgs e)
{
//声明一个子画面的对象
B myform = new B();
//第三步,由这个对象进行“订阅”操作
myform .bDelegate += new myform .BEventHandler(this.m_ShowButton_Click);
myform .ShowDialog();
}
private void m_ShowButton_Click(object sender, EventArgs e) //委托所引用的方法
{
textBox1.Text = "Hello!";
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
talencz
2008-09-19 · 超过52用户采纳过TA的回答
知道小有建树答主
回答量:163
采纳率:0%
帮助的人:137万
展开全部
简单的办法就是将A的控制声明为public void test(),
B中声明FormA nformA=new FormA();
调用nformA.test();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式