窗体上的自定义控件弹出另一个窗体,该怎么传回值啊?

student2000 2013-06-22 09:39:55

在窗体form1上有个自定义控件2,它有个按钮,弹出窗体form2.
在form2里,在文本框中输入文字后,点击按钮,关闭form2,想把文字传回给自定义控件2中的文本框里,该怎么写呢?

在自定义控件的按钮中
private void button1_Click(object sender, EventArgs e)
{
Form form2 = new Form2();
form2.ShowDialog();
// this.textBox1.Text = form2.strA;
这么写会出错
}

在form2中
public string strA;
private void button1_Click(object sender, EventArgs e)
{
strA= this.textBox1.Text ;
this.Close();
}

我知道定义一个 public static stringC 可以来传递值,但我想知道如果不用这种方法,还有别的方法来实现吗?
...全文
295 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
xcliang2004 2013-06-24
  • 打赏
  • 举报
回复
刚才没写完按错了。
private void button1_Click(object sender, EventArgs e)
        {
            Form form2 = new Form2();
            form2.OnFormClose+=(string strA){
               this.textBox1.Text  
            }
            form2.ShowDialog();
             这么写会出错
        }
在form2中
         public delegate void CallFormClose(string strA);
        public event CallFormClose OnFormClose;
        private void button1_Click(object sender, EventArgs e)
        {
           if(OnFormClose==null);
           {
               OnFormClose(strA);
           }
           this.Close();
        }
xcliang2004 2013-06-24
  • 打赏
  • 举报
回复
private void button1_Click(object sender, EventArgs e) { Form form2 = new Form2(); form2.ShowDialog(); // this.textBox1.Text = form2.strA; 这么写会出错 } 在form2中 public delegate void CallFormClose(string strA); public event CallFormClose OnFormClose; private void button1_Click(object sender, EventArgs e) { if(OnFormClose==null); this.Close(); }
student2000 2013-06-24
  • 打赏
  • 举报
回复
嗯,我用xiaomingelv说的构造函数实现了。 不过还是想知道sp1234说的 “如果你不知道“事件驱动”的概念,那么你的基本的程序设计知识缺少了一半。因为至少有一半的程序代码,是在实践处理方法中提交的。包括你这个 button1_click 方法也是这样。而你会在button1_click写代码,却不知道要在Closed事件处理过程中写代码,这就好像“骑驴找驴”,说明你还是只会抄袭、还没有接受基本的“事件驱动设计”概念。” 这段话在这个问题中有是什么含义?
u011182701 2013-06-23
  • 打赏
  • 举报
回复
构造函数就可以了。
student2000 2013-06-22
  • 打赏
  • 举报
回复
请xiaomingelv帮看看,这样写为何不对: 我在form1上增加了一个textBox1,将modifiers属性改为public 然后Form2的代码是 public partial class Form2 : Form { public Form2() { InitializeComponent(); } Form1 b; public Form2(Form1 a) { b = a; } public string strA; private void button1_Click(object sender, EventArgs e) { strA= this.textBox1.Text ; b.textBox1.Text = strA;//提示未将对象引用设置到对象的实例 this.Close(); }
小敏哥 2013-06-22
  • 打赏
  • 举报
回复
引用 7 楼 student2000 的回复:
[quote=引用 1 楼 xiaomingelv 的回复:] 如果我没理解错的话可以把自定义控件2本身作为form2的构造函数的参数,然后点击弹出form2的按钮时调用自定义的构造函数,这样就能在form2中调用你自定义的控件里面的控件了
请问您能能给具体代码吗?我对C#不熟。[/quote] 老大。。。这样还不够清楚啊,你就是个给form2增加一个有参构造函数,然后再在form2中添加一个变量 form1 b比如说form2(form1 a){ a就是form2 的父窗口,赋值 b=a;} ,之后再button1的点击事件中直接调用b,b.textBox1.Text="需要的字符串",这不就结了?????虽然不是最好的办法,但应该是最容易理解的了。。。
student2000 2013-06-22
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
private void button1_Click(object sender, EventArgs e) { Form form2 = new Form2(); form2.ShowDialog(); form2.Closed += 这里按两次TAB键 }
只有form2.Close啊没有form2.Closed啊, 您是要写 form2.FormClosed += new FormClosedEventHandler(form2_FormClosed); 吗?然后又怎么写才能得到那个form2上的文本值呢? 不好意思,确实基础差。
u010546900 2013-06-22
  • 打赏
  • 举报
回复
自己定义一个UIContext类,作为类之间的数据传输
student2000 2013-06-22
  • 打赏
  • 举报
回复
引用 1 楼 xiaomingelv 的回复:
如果我没理解错的话可以把自定义控件2本身作为form2的构造函数的参数,然后点击弹出form2的按钮时调用自定义的构造函数,这样就能在form2中调用你自定义的控件里面的控件了
请问您能能给具体代码吗?我对C#不熟。
student2000 2013-06-22
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
如果你不知道“事件驱动”的概念,那么你的基本的程序设计知识缺少了一半。因为至少有一半的程序代码,是在实践处理方法中提交的。包括你这个 button1_click 方法也是这样。而你会在button1_click写代码,却不知道要在Closed事件处理过程中写代码,这就好像“骑驴找驴”,说明你还是只会抄袭、还没有接受基本的“事件驱动设计”概念。
唉,我确实是个C#新手。
  • 打赏
  • 举报
回复
引用 3 楼 ruhuaxiao 的回复:
可以有多重方法啊, 比如 你建立一个 委托 然后用事件返回 ,但是我觉得这个太麻烦了。下面有代码你看看
你的代码中只有委托,没有事件。
  • 打赏
  • 举报
回复
如果你不知道“事件驱动”的概念,那么你的基本的程序设计知识缺少了一半。因为至少有一半的程序代码,是在实践处理方法中提交的。包括你这个 button1_click 方法也是这样。而你会在button1_click写代码,却不知道要在Closed事件处理过程中写代码,这就好像“骑驴找驴”,说明你还是只会抄袭、还没有接受基本的“事件驱动设计”概念。
ruhuaxiao 2013-06-22
  • 打赏
  • 举报
回复
可以有多重方法啊, 比如 你建立一个 委托 然后用事件返回 ,但是我觉得这个太麻烦了。下面有代码你看看
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 一个窗体对另一个窗体的数据进行修改
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Form2 f2 = new Form2();
        
        private void button1_Click(object sender, EventArgs e)
        {
            f2.xiugai=new Form2.my(f2_Event);
            f2.Show();
            
        }
        private void f2_Event(string str)
        {
            label1.Text = str;
        }
    }
}
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 一个窗体对另一个窗体的数据进行修改
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        public delegate void my(String str);//第二个窗体中设置委托
        public my xiugai; //用委托定义一个 类似方法
        //public event my xiugai ;   //一样的效果
        private void button1_Click(object sender, EventArgs e)
        {
            xiugai(textBox1.Text.ToString());
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }
    }
}
这是常用的 另外一个方法 就是在类 之下 构造函数之前定义一个 internal的 静态字段。 当然这个类也需要改成internal的 然后在该类中把 你想传递的值赋给这个字段, 在另外一个类中,就可以 用类名.字段名的方法来获取这个值了 ,(string 也可以穿,连控件估计都能传,但是没有试)
  • 打赏
  • 举报
回复
private void button1_Click(object sender, EventArgs e) { Form form2 = new Form2(); form2.ShowDialog(); form2.Closed += 这里按两次TAB键 }
小敏哥 2013-06-22
  • 打赏
  • 举报
回复
如果我没理解错的话可以把自定义控件2本身作为form2的构造函数的参数,然后点击弹出form2的按钮时调用自定义的构造函数,这样就能在form2中调用你自定义的控件里面的控件了
student2000 2013-06-22
  • 打赏
  • 举报
回复
引用 17 楼 u011130289 的回复:
直接建个类,把你要传的值放进去,在新窗口读取就可以了,不用那么麻烦了
我一开始也是这么做的,在一个类里放一个public static string,但我是新手,并且新到公司,老员工说这么不好,我不知是哪不好,也可能是不符合现有程序的风格。所以我想找别的办法。
tcmakebest 2013-06-22
  • 打赏
  • 举报
回复
这种情况大家都会遇到的,介绍一下我的解决方式: 在子窗体中放如下一个函数,然后在父窗体调用此函数, 在这个函数内部弹出窗体 如果返回不是null,则表示成功地输入了 public static string ShowFormInput(string str) { Formxx f=new Formxx(); f.str=str; if(f.ShowDialog()==DialogResult.OK){ return f.str; } return null; }
Regan-lin 2013-06-22
  • 打赏
  • 举报
回复
直接建个类,把你要传的值放进去,在新窗口读取就可以了,不用那么麻烦了
Regan-lin 2013-06-22
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
[quote=引用 3 楼 ruhuaxiao 的回复:] 可以有多重方法啊, 比如 你建立一个 委托 然后用事件返回 ,但是我觉得这个太麻烦了。下面有代码你看看
你的代码中只有委托,没有事件。[/quote] 我连事件的声明都没看到···
student2000 2013-06-22
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
如果你不知道“事件驱动”的概念,那么你的基本的程序设计知识缺少了一半。因为至少有一半的程序代码,是在实践处理方法中提交的。包括你这个 button1_click 方法也是这样。而你会在button1_click写代码,却不知道要在Closed事件处理过程中写代码,这就好像“骑驴找驴”,说明你还是只会抄袭、还没有接受基本的“事件驱动设计”概念。
很想知道您怎么在close事件中去实现把form2中的值传回给那个自定义控件的目的啊,确实我一直写程序基本上都是复制粘贴。 form2.Closed += 这里按两次TAB键 这不行啊。
加载更多回复(3)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧