C# 确定父窗体上自定义字符串的值

本文关键字:自定义 字符串 窗体 | 更新日期: 2023-09-27 18:36:22

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

表单构造函数;

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

文本框离开方法;

    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 的值吗?

C# 确定父窗体上自定义字符串的值

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

既然是公会会员,就不能只做:

(this.FindForm() as FormName).psTablename

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

你可以这样做:

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

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

控件

集合包含窗体的所有子控件的列表。 除非代码通过调用 Controls.Add 专门将其添加到该集合中,否则该集合中不会显示任何内容。 通过查看设计器生成的代码文件,可以查看正在为所有控件执行此操作的代码。

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

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

正如Devin所建议的,这种代码解决了你的问题:

(this.FindForm() as FormName).psTablename

但我认为这不是你真正想要的。实际上,这仅在自定义文本框用于 FormName 或从 FormName 派生的窗体中时才有效,因为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);

这是否实现了您的目标?

protected override void OnLeave(EventArgs e)
{
    string x = this.psTableName;
}