我在标准Windows窗体上有自定义TextBox。在TextBox的OnLeave()中,我试图找出在其构造函数中添加到表单的特定自定义字符串属性的值;
表单构造函数;
public partial class FormName : Form
{
public string psTableName { get; set; }
TextBox OnLeave方法;
protected override void OnLeave(EventArgs e)
{
try
{
if (!Convert.ToDouble(this.Text).Equals(this.rnOrigValue))
{
在上面的if语句中,我试图找到;
This.FindForm().psTableName
我尝试使用;
循环控件foreach (Control loObject in this.FindForm().Controls)
{
// Code here
}
但是只检索TextBox,Labels等。但是我可以找到psTableName的值吗?
答案 0 :(得分:4)
首先,字符串不是控件,因此FindForm().Controls
既然是公共会员,你不能这样做:
(this.FindForm() as FormName).psTablename
首先,我会检查null,但是你明白了。
答案 1 :(得分:2)
你可以这样做:
FormName form = this.FindForm() as FormName;
if (form != null)
{
string psTableName = form.psTablename;
}
然而,这通常是不好的做法。通常,您不希望UserControl假定它的父表单是特定类型。最好在控件上创建一个可由表单设置的公共表名称属性。
Controls集合包含表单的所有子控件的列表。除非您的代码通过调用Controls.Add
将其专门添加到该集合中,否则该集合中不会显示任何内容。通过查看设计器生成的代码文件,您可以看到所有控件的代码。
你提到了Form的构造函数,但是你没有显示它。
此外,除非发生命名冲突,否则继续使用this
关键字,这是不必要的。如果没有命名冲突,则使用this
关键字是可选的。例如,您可以简单地说FindForm().Controls
或Convert.ToDouble(Text).Equals(rnOrigValue)
。
答案 2 :(得分:1)
正如Devin所说,这种代码解决了你的问题:
(this.FindForm() as FormName).psTablename
但我认为这不是你真正想要的。实际上,这只适用于在FormName中使用自定义TextBox或从FormName派生的Form中,因为this.FindForm() as FormName
在其他所有情况下都会返回null。这是控件的一个很大的限制,我会尽量避免它。
例如,你可以向你的控件添加一个psTableName属性,该属性可以由表单传递,但每次表单中的属性发生变化时(或许可以使用ad hoc事件),你都应该小心更新它。
否则你应该以这种方式使用反射:
string s;
Form parentForm = FindForm();
PropertyInfo pi = parentForm.GetType().GetProperty("psTableName");
if (pi != null)
s = (string)pi.GetValue(parentForm, null);
答案 3 :(得分:0)
这是否达到了您的目标?
protected override void OnLeave(EventArgs e)
{
string x = this.psTableName;
}