当前位置: 代码迷 >> C# >> 主窗体动态生成的N个窗体,当某个窗体某个控件发生事件,主窗体如何知道是哪个窗体和哪个控件发生的。
  详细解决方案

主窗体动态生成的N个窗体,当某个窗体某个控件发生事件,主窗体如何知道是哪个窗体和哪个控件发生的。

热度:19   发布时间:2016-05-05 03:43:21.0
主窗体动态生成的N个窗体,当某个窗体某个控件发生事件,主窗体怎么知道是哪个窗体和哪个控件发生的。。
在主窗体有按扭1和按扭2.
1.按扭点击发生动态生成窗体,并向窗体添加控件。
 private void button1_Click(object sender, EventArgs e)
        {
            Form a = new Form();
            a.Name = "动态创建窗体一";
            a.Text = "动态创建窗体一";
            getform(a);
            a.Show();
        }

private void button2_Click(object sender, EventArgs e)
        {
            Form b = new Form();
            b.Name = "动态创建窗体二";
            b.Text = "动态创建窗体二";
            getform(b);
            b.Show();
        }

///窗体添加控件
 private void getform(Form form)
        {
           
            FlowLayoutPanel fp1 = new FlowLayoutPanel();
            fp1.Location = new Point(0, 0);
            fp1.Height = 100;
            fp1.Visible = true;

            Button bt = new Button();
            bt.Text = "登录";
            bt.Click += new EventHandler(bt_click);
            fp1.Controls.Add(bt);

            FlowLayoutPanel fp2 = new FlowLayoutPanel();
            fp1.Location = new Point(0, 100);
            fp2.Visible = true;
            TextBox tb = new TextBox();
            tb.Text = "123";
            tb.Name = "tbname";
            fp2.Controls.Add(tb);

            form.Controls.Add(fp1);
            form.Controls.Add(fp2);
        }

///动态生成窗体的委托事件
 private void bt_click(object sender,EventArgs e)
        {
              怎么获取当前控件的名称和窗体的名称;
        }



------解决思路----------------------
这在设计上是越俎代庖的,职责不清的。刚编程的人喜欢空谈“控制、监视”的说法,似乎什么事件驱动都想用一个大循环语句来监视处理一下很爽。

实际上,UI设计是分层的、隔离的。低级的模块(窗体、用户控件、自定义控件、自定义组件、外部进程、系统底层驱动.......)自成服务体系,向上向外而“隔离”,不允许上层纠结它的内部到底用了什么控件,它完全可能随后重构内部设计。它只向上层暴露业务接口。即使是事件委托,也是从业务角度来定义的事件委托,而不是什么控件的。

这方面不是会点技术就能开始搞程序设计的,就好像不是学会点photoshop等工具就能做美工、不是学点office等工具就能当总经理秘书。但是如果你不努力去实践这种“面向业务接口、层间职责分离”的设计,那么设计出来的东西将是多么难用和低级啊。

好的设计师不是在一个低级的“编程培训”课程上学习的。这些软件设计基本知识必须专门学习软件工程课程来得到。
------解决思路----------------------
bt_click(object sender,EventArgs e)
{
Control control = sender as Control;
if(control!=null)
{
      var name =control.Name;
      do
      {
       var parent = control.Parent;
        if(parent is Form){break;}
      }
      while(control.Parent !=null);
}
}

这是获取控件及子窗体的,然后怎么通知主窗体就是你要弄个事件或者委托
  相关解决方案