0

我在标准 Windows 窗体上有一个自定义文本框。在 TextBox 的 OnLeave() 中,我试图找出在其构造函数中添加到表单的特定自定义字符串属性的值;

表单构造函数;

public partial class FormName : Form
{
    public string psTableName { get; set; }

文本框 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
}

但这仅检索文本框、标签等。但是我可以找到 psTableName 的值吗?

4

4 回答 4

4

首先,字符串不是控件,因此不会被返回FindForm().Controls

既然它是一个公共成员,你不能这样做:

(this.FindForm() as FormName).psTablename

我会首先检查 null,但你明白了。

于 2012-06-06T18:53:07.547 回答
2

你可以这样做:

FormName form = this.FindForm() as FormName;
if (form != null)
{
    string psTableName = form.psTablename;
}

但是,这通常是不好的做法。通常,您不希望 UserControl 假定它的父窗体属于特定类型。最好在控件上创建一个可以由表单设置的公共表名属性。

Controls 集合包含表单的所有子控件的列表。除非您的代码专门通过调用将其添加到该集合中,否则该集合中不会出现任何内容Controls.Add。通过查看设计器生成的代码文件,您可以查看所有控件的代码。

您提到了表单的构造函数,但您没有显示它。

此外,this除非您有命名冲突,否则您会继续使用不必要的关键字。当没有命名冲突时,使用this关键字是可选的。例如,您可以简单地说FindForm().Controlsor Convert.ToDouble(Text).Equals(rnOrigValue)

于 2012-06-06T18:53:12.380 回答
1

正如 Devin 所建议的,这种代码可以解决您的问题:

(this.FindForm() as FormName).psTablename

但我认为这不是你真正想要的。实际上,这仅在您的自定义 TextBox 用于 FormName 或从 FormName 派生的 Form 时才有效,因为this.FindForm() as FormName在所有其他情况下都会返回 null。这对控件来说是一个很大的限制,我会尽量避免它。

例如,您可以将 psTableName 属性添加到可以由表单传递的控件,但您应该小心地在每次表单中的属性更改时更新它(可能是临时事件)。

否则,您应该以这种方式使用反射:

string s;
Form parentForm = FindForm();
PropertyInfo pi = parentForm.GetType().GetProperty("psTableName");
if (pi != null)
    s = (string)pi.GetValue(parentForm, null);
于 2012-06-07T09:07:08.707 回答
0

这是否实现了您正在寻找的东西?

protected override void OnLeave(EventArgs e)
{
    string x = this.psTableName;
}
于 2012-06-06T18:56:53.400 回答