搜索
bottom↓
回复: 17

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

[复制链接]

出590入992汤圆

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入442汤圆

发表于 2018-7-31 22:37:32 来自手机 | 显示全部楼层
把窗口类引用传进去。

出0入0汤圆

发表于 2018-7-31 22:44:46 | 显示全部楼层
新打开的窗体在关闭后对象实例其实都在,可以直接访问那个窗体实例的 public 成员

出0入0汤圆

发表于 2018-7-31 22:46:42 | 显示全部楼层
有一个常用得到的方法是用 Reflector 来看像 FileOpenDialog 这样的类在 .NET 的库中是怎么实现的

出0入16汤圆

发表于 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;
这样就可以获取了。


出0入0汤圆

发表于 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 还可以用 绑定到同一个对象的方法

出590入992汤圆

 楼主| 发表于 2018-8-1 08:50:13 | 显示全部楼层
xstt 发表于 2018-7-31 22:46
FRM_S
// 需要定义一个属性,可以外部访问的。
InputTxt {get;set;}

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

出0入0汤圆

发表于 2018-8-1 09:13:40 | 显示全部楼层
请搜索 委托

出0入0汤圆

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

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

出0入58汤圆

发表于 2018-8-1 09:30:02 | 显示全部楼层
本帖最后由 shawn_bu 于 2018-8-1 09:31 编辑

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

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

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

出0入25汤圆

发表于 2018-8-1 09:58:00 | 显示全部楼层
用委托事件回调。
  1. // form1.cs

  2. namespace Main
  3. {
  4.          public delegate void GetText ( string text ); //定义委托类型
  5.          
  6.          public  class form1
  7.          {
  8.                 //回调事件
  9.         public event  GetText GetFormText;
  10.                
  11.                  
  12.                
  13.                 private void Button_Click ( object sender, EventArgs e )
  14.         {
  15.             string text = this.TextBox.Text; // 记录文本
  16.                         GetFormText?.Invoke(text);  // 调用回调
  17.         }
  18.          }
  19. }

  20. // fromMain.CS
  21. namespace Main
  22. {
  23.           public  class fromMain
  24.          {

  25.             private void GetTextFormFrom ( string text)
  26.         {
  27.             // 更新文本;
  28.                         this.TextBox.Text = text;
  29.         }
  30.                
  31.                 private void Button_Click ( object sender, EventArgs e )
  32.         {
  33.             form1 f1 = new form1();
  34.                        
  35.                         f1.GetFormText += GetTextFormFrom;
  36.                         f1.Show ( );
  37.         }

  38.          }
  39. }
复制代码

出0入0汤圆

发表于 2018-8-1 10:02:21 来自手机 | 显示全部楼层
可以用委托

出0入16汤圆

发表于 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的了。

出0入0汤圆

发表于 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();
            }
        }
    }
}


出0入0汤圆

发表于 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;
        }
    }
}

出0入0汤圆

发表于 2018-8-14 18:52:12 | 显示全部楼层
Form 1 and Form 2 Capture

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-8-14 18:56:48 | 显示全部楼层
Click [Button 1] --> Show Form2
改變 Form2  Textbox 內容,會即時顯示 在 Form1
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 15:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表