SUPER_CRJ 发表于 2018-7-31 22:35:47

C#通过新建窗体中的操作如何返回数据

本人最近做一个项目,实在发现自己C#的水平有限。准备这项目做完后,去专业的地方培训一下。
问题可以简化如下:一共有两个窗体:FRM_M和FRM_S。在FRM_M窗体中假设有三个按键,每个按键按下地都会新建一个FRM_S,在FRM_S中有一个文本框,和一个按键、
        现在的问题是:在FRM_S下点击按键要把文本框的名称更新到使之打开的FRM_M中的按键名称下去。这个应该如何做?

wye11083 发表于 2018-7-31 22:37:32

把窗口类引用传进去。

wudicgi 发表于 2018-7-31 22:44:46

新打开的窗体在关闭后对象实例其实都在,可以直接访问那个窗体实例的 public 成员

wudicgi 发表于 2018-7-31 22:46:42

有一个常用得到的方法是用 Reflector 来看像 FileOpenDialog 这样的类在 .NET 的库中是怎么实现的

xstt 发表于 2018-7-31 22:46:52


FRM_S
// 需要定义一个属性,可以外部访问的。
InputTxt {get;set;}
然后窗口内的点击事件将TXT输入的值给InputTxt
this.InputTxt=textBox1.Text;

FRM_M 点击事件类似:
var a=new FRM_S();
a.showDialog();
var inputtxt=a.InputTxt;
这样就可以获取了。


zyqcome 发表于 2018-8-1 08:01:32

在窗口间传值有很多方法,看楼主的要求是要马上更新到主窗口
#1 属性传值
   这个楼上有人提到了,就是让两个窗口相互知道
   Window A,B
   B中有个属性为 window aa
   在A中:
      Button.click —->b = new B——>b.aa=this;——>显示B
      在B中:
       button.click ——>aa.button1.Content =new value
这个方法应该会遇到说你没有权限在另一个窗口修改这个窗口的UI问题,网上找个切换到主线程的方法

#代理 delegate
   B中有代理 bb,在A中订阅 bb,
   b.click—->bb(new value)———>A中订阅函数—->改值

会有同样跨线程修改 UI的问题

# 事件 event
   这个没有跨线程的问题,但需要自己实现一下,事件消息

#WPF 还可以用 绑定到同一个对象的方法

SUPER_CRJ 发表于 2018-8-1 08:50:13

xstt 发表于 2018-7-31 22:46
FRM_S
// 需要定义一个属性,可以外部访问的。
InputTxt {get;set;}


谢谢,这个方式很好,但是我是想:点击按键后就立刻更新,不是关闭窗口再更新,这有没有什么好方法?

spring152 发表于 2018-8-1 09:13:40

请搜索 委托

浮华一生 发表于 2018-8-1 09:25:56

SUPER_CRJ 发表于 2018-8-1 08:50
谢谢,这个方式很好,但是我是想:点击按键后就立刻更新,不是关闭窗口再更新,这有没有什么好方法? ...

委托啦, 传引用啦(类似C得指针), 都可以吧。 不过委托感觉正规点。哈哈

shawn_bu 发表于 2018-8-1 09:30:02

本帖最后由 shawn_bu 于 2018-8-1 09:31 编辑

子窗口中定义public成员,在子窗口保存按钮事件中把UI中的数据赋值到public成员里面。子窗口按钮事件中设置dialog.result=OK(如果没记错的话)

在父窗口中判断子窗口的dialog result是不是OK, 如果是的话获取子窗口对应的public成员即可。

【编辑】如果不是显示dialog的就委托啦,专门用来干这个的。

墨非 发表于 2018-8-1 09:58:00

用委托事件回调。
// form1.cs

namespace Main
{
       public delegate void GetText ( string text ); //定义委托类型
       
       publicclass form1
       {
                //回调事件
      public eventGetText GetFormText;
               
               
               
                private void Button_Click ( object sender, EventArgs e )
      {
            string text = this.TextBox.Text; // 记录文本
                        GetFormText?.Invoke(text);// 调用回调
      }
       }
}

// fromMain.CS
namespace Main
{
          publicclass fromMain
       {

          private void GetTextFormFrom ( string text)
      {
            // 更新文本;
                        this.TextBox.Text = text;
      }
               
                private void Button_Click ( object sender, EventArgs e )
      {
            form1 f1 = new form1();
                       
                        f1.GetFormText += GetTextFormFrom;
                        f1.Show ( );
      }

       }
}

dspic 发表于 2018-8-1 10:02:21

可以用委托

xstt 发表于 2018-8-1 10:42:31

SUPER_CRJ 发表于 2018-8-1 08:50
谢谢,这个方式很好,但是我是想:点击按键后就立刻更新,不是关闭窗口再更新,这有没有什么好方法? ...


可以试试这样

//定义一个变量
FRM_M frm_m_obj=null;

FRM_S(FRM_M obj)//重载初始化函数,将frm_m传入
{
frm_m_obj=obj;
}
//点击事件修改为
frm_m_obj.TextValue=textBox1.Text;


FRM_M 修改
建立一个属性
Public string TextValue{
set{
//设置本窗体的控件的内容
textBox1.Text=value;
}
}

//FRM_M 按钮事件
var a=new FRM_S(this);
a.show();

//这样三个按钮new出来的都可以修改frm_M的了。

easier 发表于 2018-8-14 18:47:48

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsForm_Form
{
    public partial class Form1 : Form
    {
      public Form1()
      {
            InitializeComponent();
      }

      private void button1_Click(object sender, EventArgs e)
      {
            {
                Form2 f2 = new Form2(textBox_Form1_0, button1);
                f2.Show();
            }
      }
    }
}


easier 发表于 2018-8-14 18:48:10

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsForm_Form
{
    public partial class Form2 : Form
    {
      private TextBox _txt_Box = null;
      private Button _but_Form = null;

      public Form2()
      {
            InitializeComponent();
      }

      public Form2(TextBox txt_box, Button but_Form1)
      {
            InitializeComponent();
            _txt_Box = txt_box;
            _but_Form = but_Form1 ;
      }

      private void textBox_Form2_0_TextChanged(object sender, EventArgs e)
      {
            _txt_Box.Text = textBox_Form2_0.Text;
            _but_Form.Text = textBox_Form2_0.Text;
      }
    }
}

easier 发表于 2018-8-14 18:52:12

Form 1 and Form 2 Capture

easier 发表于 2018-8-14 18:56:48

Click --> Show Form2
改變 Form2Textbox 內容,會即時顯示 在 Form1
页: [1]
查看完整版本: C#通过新建窗体中的操作如何返回数据