如何将控件里的值传到主窗体?
我的一个控件,里面是动态生成的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;
}
内容表示试过,你说的是这个地址把:传送门
表示不行,请问你能否给出非复制代码? --------------------编程问答--------------------
已在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 --------------------编程问答-------------------- --------------------编程问答--------------------
new出来的,楼上说的我不懂事件,这个确实,现在开始看事件,貌似上班这么久了,真的没有用过事件.
--------------------编程问答--------------------
private void butOK_Click(object sender, EventArgs e)
{ //Form1 frm = new Form1();
((TextBox)frm.Controls["txtPwd"]).Text = "";
}
事件比较好,要不你这个用户控件就不够“用户”了,好像是专属Form1使用,如果其他窗体使用的话你就要修改((TextBox)frm.Controls["txtPwd"]).Text = "";这些代码了 --------------------编程问答--------------------
估计楼主用户控件里的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而是显示到其他控件你这里也要修改了!!根本无法应对变化 --------------------编程问答--------------------
估计楼主用户控件里的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的值为什么没有发生改变呢, --------------------编程问答--------------------
估计楼主用户控件里的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(窗体名字) 然后给他的任何子控件赋值
.........
我问的不是这个东西,是传值的问题. --------------------编程问答--------------------
刚才看事件的例子,写了个,但是有点问题:
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());
}
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 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;
}
原因是不是跟你上面说的 //你注册了事件但是没响应事件 ?
但是这里要怎么响应呢,很纠结. --------------------编程问答--------------------
//刚才没注意两个参数,改成这个就行了,
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;
} --------------------编程问答--------------------
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;
}
明天我把所有的代码整理好给你看~~~诶,夜晚再看看,非常感谢你了. --------------------编程问答--------------------
求帮忙看看哪儿错了.多谢了.
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#