当前位置:编程学习 > C#/ASP.NET >>

如何将控件里的值传到主窗体?

我的一个控件,里面是动态生成的Button,无数多,然后点击Button,会将Button上的text显示在窗体的textbox里面,但是我怎么都改变不了主窗体里面的值.求助.
感觉不同于普通的窗体传值,
用Owner和属性试过 都不行.求教一个好的安全性办法. C# 控件 主窗体 传值 安全 --------------------编程问答-------------------- 上代码啊。。。不要太多 --------------------编程问答-------------------- LZ是怎么传值更改的呢 --------------------编程问答-------------------- 给“你的控件”添加event,“你的控件”内的Button点击是触发“你的控件”的event事件,在窗体上的“你的控件”event事件内修改textbox.Text --------------------编程问答-------------------- 控件后台代码:

   public partial class uc_keyboard : UserControl
    {
        public uc_keyboard()
        {
            InitializeComponent();
        }
        //public string id { get; set; }
        //public string key { get; set; }
        uc_keyboard ukey;
        private void uc_keyboard_Load(object sender, EventArgs e)
        {
            Create();//创建无数个button按钮,name都不同,并将按钮点击的字符结果累加到属性key
            ukey = new uc_keyboard();
        }
       private void Create()
        {//此处省略若干
        }
        private void btnOK_Click(object sender, EventArgs e)
        {
            //txtPwd为主窗体的textbox,发现主窗体textbox压根没反应
            ((TextBox)frm.Controls["txtPwd"]).Text = ukey.key;
        }
--------------------编程问答--------------------
引用 3 楼 urhp02857 的回复:
给“你的控件”添加event,“你的控件”内的Button点击是触发“你的控件”的event事件,在窗体上的“你的控件”event事件内修改textbox.Text

内容表示试过,你说的是这个地址把:传送门

表示不行,请问你能否给出非复制代码? --------------------编程问答--------------------
引用 1 楼 hwenycocodq520 的回复:
上代码啊。。。不要太多

已在4#给出代码 --------------------编程问答-------------------- 你这个frm在哪里定义的? --------------------编程问答-------------------- 使用事件嘛。
因为你不懂事件,在你已知的概念中转啊转啊,当然转不出来。 --------------------编程问答-------------------- 估计楼主用户控件里的frm是重新new 一个出来的? --------------------编程问答-------------------- 首先问题是“你点击button有出发btnOK_Click事件吗” --------------------编程问答-------------------- 楼主不要在里面定义那些属性了,用事件传相应的参数,使你的用户控件代码更加简洁,就不会出现uc_keyboard ukey;这些字段了 --------------------编程问答--------------------

public partial class uc_keyboard : UserControl
{
      public event EventHandler<UCKeyboardEventArgs> KeyboardClick;
        public uc_keyboard()
        {
            InitializeComponent();
        }
        private void uc_keyboard_Load(object sender, EventArgs e)
        {
            Create();
        }
       private void Create()
        {
             //此处省略若干
        }
        private void btnOK_Click(object sender, EventArgs e)
        {   
             if(KeyboardClick!=null)
               KeyboardClick(new UCKeyboardEventArgs((sender as Button).Text));
        }
//略

public class UCKeyboardEventArgs:EventArgs
{
    public string KeyCode{get;private set;}
    public UCKeyboardEventArgs(string code){KeyCode=code;}
}


Form1

     //uc_keyboard1 假设为该控件名
   Load事件:
      uc_keyboard1.KeyboardClick+=OnKeyboardClick;

   private void OnKeyboardClick(object sender,UCKeyboardEventArgs e)
   {
         txtPwd.Text=e.KeyCode;
   }


手打的,难免有疏忽的错误,你可以看到这样定义事件用户控件根本不用关心Form1 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 9 楼 hwenycocodq520 的回复:
估计楼主用户控件里的frm是重新new 一个出来的?

new出来的,楼上说的我不懂事件,这个确实,现在开始看事件,貌似上班这么久了,真的没有用过事件.

        private void butOK_Click(object sender, EventArgs e)
        {    //Form1 frm = new Form1();
            ((TextBox)frm.Controls["txtPwd"]).Text = "";
                   }
--------------------编程问答--------------------
引用 14 楼 dong3580 的回复:
Quote: 引用 9 楼 hwenycocodq520 的回复:

估计楼主用户控件里的frm是重新new 一个出来的?

new出来的,楼上说的我不懂事件,这个确实,现在开始看事件,貌似上班这么久了,真的没有用过事件.

        private void butOK_Click(object sender, EventArgs e)
        {    //Form1 frm = new Form1();
            ((TextBox)frm.Controls["txtPwd"]).Text = "";
                   }


事件比较好,要不你这个用户控件就不够“用户”了,好像是专属Form1使用,如果其他窗体使用的话你就要修改((TextBox)frm.Controls["txtPwd"]).Text = "";这些代码了 --------------------编程问答--------------------
引用 15 楼 hwenycocodq520 的回复:
Quote: 引用 14 楼 dong3580 的回复:

Quote: 引用 9 楼 hwenycocodq520 的回复:

估计楼主用户控件里的frm是重新new 一个出来的?

new出来的,楼上说的我不懂事件,这个确实,现在开始看事件,貌似上班这么久了,真的没有用过事件.

        private void butOK_Click(object sender, EventArgs e)
        {    //Form1 frm = new Form1();
            ((TextBox)frm.Controls["txtPwd"]).Text = "";
                   }


事件比较好,要不你这个用户控件就不够“用户”了,好像是专属Form1使用,如果其他窗体使用的话你就要修改((TextBox)frm.Controls["txtPwd"]).Text = "";这些代码了


还有如果不是显示到txtPwd而是显示到其他控件你这里也要修改了!!根本无法应对变化 --------------------编程问答--------------------
引用 16 楼 hwenycocodq520 的回复:
Quote: 引用 15 楼 hwenycocodq520 的回复:

Quote: 引用 14 楼 dong3580 的回复:

Quote: 引用 9 楼 hwenycocodq520 的回复:

估计楼主用户控件里的frm是重新new 一个出来的?

new出来的,楼上说的我不懂事件,这个确实,现在开始看事件,貌似上班这么久了,真的没有用过事件.

        private void butOK_Click(object sender, EventArgs e)
        {    //Form1 frm = new Form1();
            ((TextBox)frm.Controls["txtPwd"]).Text = "";
                   }


事件比较好,要不你这个用户控件就不够“用户”了,好像是专属Form1使用,如果其他窗体使用的话你就要修改((TextBox)frm.Controls["txtPwd"]).Text = "";这些代码了


还有如果不是显示到txtPwd而是显示到其他控件你这里也要修改了!!根本无法应对变化

我先看事件,下午再来解决这个问题.
但是有点搞不懂:

 ((TextBox)frm.Controls["txtPwd"]).Text ="";

断点发现这行代码被执行了,但是txtPwd的值为什么没有发生改变呢, --------------------编程问答--------------------
引用 17 楼 dong3580 的回复:
Quote: 引用 16 楼 hwenycocodq520 的回复:

Quote: 引用 15 楼 hwenycocodq520 的回复:

Quote: 引用 14 楼 dong3580 的回复:

Quote: 引用 9 楼 hwenycocodq520 的回复:

估计楼主用户控件里的frm是重新new 一个出来的?

new出来的,楼上说的我不懂事件,这个确实,现在开始看事件,貌似上班这么久了,真的没有用过事件.

        private void butOK_Click(object sender, EventArgs e)
        {    //Form1 frm = new Form1();
            ((TextBox)frm.Controls["txtPwd"]).Text = "";
                   }


事件比较好,要不你这个用户控件就不够“用户”了,好像是专属Form1使用,如果其他窗体使用的话你就要修改((TextBox)frm.Controls["txtPwd"]).Text = "";这些代码了


还有如果不是显示到txtPwd而是显示到其他控件你这里也要修改了!!根本无法应对变化

我先看事件,下午再来解决这个问题.
但是有点搞不懂:

 ((TextBox)frm.Controls["txtPwd"]).Text ="";

断点发现这行代码被执行了,但是txtPwd的值为什么没有发生改变呢,
我比较好奇这个问题 --------------------编程问答-------------------- findControl(窗体名字)  然后给他的任何子控件赋值 --------------------编程问答-------------------- mark --------------------编程问答--------------------
引用 19 楼 q312977 的回复:
findControl(窗体名字)  然后给他的任何子控件赋值

.........
我问的不是这个东西,是传值的问题. --------------------编程问答--------------------
引用 12 楼 hwenycocodq520 的回复:

刚才看事件的例子,写了个,但是有点问题:

namespace Print
{
    public class MyTime
    {
        public event EventHandler Elapsed;
        private void OnOneSecond(object s, EventArgs a)
        {
            if (Elapsed!=null)
            {
                Elapsed(s, a);
            }
        }
    }
    class ClassA
    {
        public void Time(object s, EventArgs a)
        {
            Console.WriteLine("A");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ClassA a = new ClassA();
            MyTime t = new MyTime();
            t.Elapsed += a.Time;
        }
    }
}

屏幕上应该打印出来 A啊,但是实际什么都没有,什么情况? --------------------编程问答-------------------- namespace Print
{
    public class MyTime
    {
        public event EventHandler Elapsed;
        public void Start()
        {
             OnOneSecond();
        }
        private void OnOneSecond(object s, EventArgs a)
        {
            if (Elapsed!=null)
            {
                Elapsed(s, a);
            }
        }
    }
    class ClassA
    {
        public void Time(object s, EventArgs a)
        {
            Console.WriteLine("A");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ClassA a = new ClassA();
            MyTime t = new MyTime();
            //你注册了事件但是没响应事件
            t.Elapsed += a.Time;   
            t.Start();
        }
    }
} --------------------编程问答--------------------

namespace Print
{
    public class MyTime
    {
        public event EventHandler Elapsed;
        public void Start()
        {
             OnOneSecond();
        }
        private void OnOneSecond(object s, EventArgs a)
        {
            if (Elapsed!=null)
            {
                Elapsed(s, a);
            }
        }
    }
    class ClassA
    {
        public void Time(object s, EventArgs a)
        {
            Console.WriteLine("A");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ClassA a = new ClassA();
            MyTime t = new MyTime();
            //你注册了事件但是没响应事件
            t.Elapsed += a.Time;   
            t.Start();
        }
    }

--------------------编程问答-------------------- 这里改下,忘记传参数了

public void Start()
{
    OnOneSecond(this,new EventArgs());
}
--------------------编程问答--------------------
引用 24 楼 hwenycocodq520 的回复:

namespace Print
{
    public class MyTime
    {
        public event EventHandler Elapsed;
        public void Start()
        {
             OnOneSecond();
        }
        private void OnOneSecond(object s, EventArgs a)
        {
            if (Elapsed!=null)
            {
                Elapsed(s, a);
            }
        }
    }
    class ClassA
    {
        public void Time(object s, EventArgs a)
        {
            Console.WriteLine("A");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ClassA a = new ClassA();
            MyTime t = new MyTime();
            //你注册了事件但是没响应事件
            t.Elapsed += a.Time;   
            t.Start();
        }
    }

恩 +1 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 12 楼 hwenycocodq520 的回复:

public partial class uc_keyboard : UserControl
{
      public event EventHandler<UCKeyboardEventArgs> KeyboardClick;
        public uc_keyboard()
        {
            InitializeComponent();
        }
        private void uc_keyboard_Load(object sender, EventArgs e)
        {
            Create();
        }
       private void Create()
        {
             //此处省略若干
        }
        private void btnOK_Click(object sender, EventArgs e)
        {   
             if(KeyboardClick!=null)
               KeyboardClick(new UCKeyboardEventArgs((sender as Button).Text));
        }
//略

public class UCKeyboardEventArgs:EventArgs
{
    public string KeyCode{get;private set;}
    public UCKeyboardEventArgs(string code){KeyCode=code;}
}


Form1

     //uc_keyboard1 假设为该控件名
   Load事件:
      uc_keyboard1.KeyboardClick+=OnKeyboardClick;

   private void OnKeyboardClick(object sender,UCKeyboardEventArgs e)
   {
         txtPwd.Text=e.KeyCode;
   }


手打的,难免有疏忽的错误,你可以看到这样定义事件用户控件根本不用关心Form1



           if(KeyboardClick!=null)
                KeyboardClick(new UCKeyboardEventArgs((sender as Button).Text)); 

这句报错,提示参数没有采用xxx的重载, --------------------编程问答--------------------

//刚才没注意两个参数,改成这个就行了,
 keyboardClick(sender, new UCKeyboardEventArgs(key));

已经改好,但是断点 发现这行代码没有运行,跟上面我问你的那个代码类似:

   private void OnKeyboardClick(object sender,UCKeyboardEventArgs e)
    {
          txtPwd.Text=e.KeyCode;
    } 

原因是不是跟你上面说的  //你注册了事件但是没响应事件   ?
但是这里要怎么响应呢,很纠结. --------------------编程问答--------------------
引用 29 楼 dong3580 的回复:

//刚才没注意两个参数,改成这个就行了,
 keyboardClick(sender, new UCKeyboardEventArgs(key));

已经改好,但是断点 发现这行代码没有运行,跟上面我问你的那个代码类似:

   private void OnKeyboardClick(object sender,UCKeyboardEventArgs e)
    {
          txtPwd.Text=e.KeyCode;
    } 

原因是不是跟你上面说的  //你注册了事件但是没响应事件   ?
但是这里要怎么响应呢,很纠结.


Load事件:
      uc_keyboard1.KeyboardClick+=OnKeyboardClick;
 
   private void OnKeyboardClick(object sender,UCKeyboardEventArgs e)
   {
         txtPwd.Text=e.KeyCode;
   } --------------------编程问答--------------------
Quote: 引用 30 楼 hwenycocodq520 的回复:

Quote:


1.Load事件不是窗体加载的时候出来么,我打开的时候窗体已经加载了呀,所以我写在button事件里面

2.敲uc_keyboard1,但是出不来 uc_keyboard1.KeyboardClick,所以我实例化了一下,你看下面代码.
但是这个没反应呀,txtPwd没反应


        private void butGo_Click(object sender, EventArgs e)
        {
            uc_keyboard ukey = new uc_keyboard();
            ukey.keyboardClick += new EventHandler<uc_keyboard.UCKeyboardEventArgs>(show);
        }
        void show(object sender, uc_keyboard.UCKeyboardEventArgs e)
        {
            txtPwd.Text = e.KeyCode;
        }
--------------------编程问答--------------------
Quote: 引用 30 楼 hwenycocodq520 的回复:

Quote:

明天我把所有的代码整理好给你看~~~诶,夜晚再看看,非常感谢你了. --------------------编程问答--------------------
引用 1 楼 hwenycocodq520 的回复:

求帮忙看看哪儿错了.多谢了.
1.控件名称:uc_keyboard,主窗体名称:Form1
2.运行时截图:
3.控件后台代码:

public partial class uc_keyboard : UserControl
{
    public event EventHandler<UCKeyboardEventArgs> keyboardClick;
    public uc_keyboard()
    {
        InitializeComponent();
    }
    public string id { get; set; }
    public string key { get; set; }
    //public string pwd = "";
    private void uc_keyboard_Load(object sender, EventArgs e)
    {
        //控件加载时创建
        Create();
    }

    private void Create()
    {
        //创建10个数字和26个字母按钮
    }
   //每次点击按钮时触发btn_Click事件,将点击按钮的文本累加到key
    void btn_Click(object sender, EventArgs e)
    {
        key += ((Button)sender).Text;
    }

    Form1 frm = new Form1();
    //点击OK时触发
    private void btnOK_Click(object sender, EventArgs e)
    {
        //((TextBox)frm.Controls["txtPwd"]).Text = ukey.key;
        if (keyboardClick != null)
        {
            keyboardClick(sender, new UCKeyboardEventArgs(key));
        }
    }

    public class UCKeyboardEventArgs : EventArgs
    {
        public string KeyCode { get; private set; }
        public UCKeyboardEventArgs(string code) { KeyCode = code; }
    }
}

主窗体后台代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    public Form1(string key)
    {
        this.keypwd = key;
    }
    public string keypwd { get; set; }

    private void btnCheck_Click(object sender, EventArgs e)
    {
        //string pwd = txtPwd.Text.Trim();
        //uc_keyboard kb = new uc_keyboard();
        //试图获取传过来的值,但都不成功
    }

    private void btnKeyBoard_Click(object sender, EventArgs e)
    {
        //初始化控件参数
    }


    //点击"输入"时传过来的值将填入txtPwd文本框中
    private void butGo_Click(object sender, EventArgs e)
    {
        uc_keyboard ukey = new uc_keyboard();
        ukey.keyboardClick += new EventHandler<uc_keyboard.UCKeyboardEventArgs>(show);
    }
    void show(object sender, uc_keyboard.UCKeyboardEventArgs e)
    {
        txtUserid.Text = e.KeyCode;
    }
}
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,