C# 如何从嵌套结构的ToString方法中访问表单控件

C# 如何从嵌套结构的ToString方法中访问表单控件,c#,nested-class,C#,Nested Class,我正在用C#构建一个小的windows窗体应用程序。在表单代码中,我定义了一个带有ToString方法的公共结构,该方法必须从同一表单上的组合框中的项构建其部分输出。这听起来并不难 public partial class Form1 : Form { public struct OrderLineItem { string someString; int index; string ToString() {return someStrin

我正在用C#构建一个小的windows窗体应用程序。在表单代码中,我定义了一个带有ToString方法的公共结构,该方法必须从同一表单上的组合框中的项构建其部分输出。这听起来并不难

public partial class Form1 : Form
{
 public struct OrderLineItem
    {
     string someString;
     int index;
     string ToString()
        {return someString + ActiveForm.sizeComboBox.Items[index].ToString();}  
    }
}
它抱怨说,它找不到sizembobox的定义。如果我显式使用表单的名称,它表示静态字段需要对象引用。。。
我不太清楚这是什么意思。使用this.sizembobox引用的是结构,而不是表单。再次使用sizembobox,需要对象引用。

结构知道其包含的类类型,但不知道该类型的任何特定实例,除非您告诉它。例如,您可以创建一个采用Form1对象的构造函数,它可以将对该表单的引用保存在成员变量中

public partial class Form1 : Form 
{ 
 public struct OrderLineItem 
    { 
     string someString; 
     int index; 
     Form1 parentForm;

     internal OrderLineItem(Form1 parentForm)
     {
         this = new OrderLineItem();
         this.parentForm = parentForm;
     }

     string ToString() 
     {
         if (parentForm == null)
             return string.Empty;
         else
             return someString + parentForm.sizeComboBox.Items[index].ToString();
     }   
    } 
} 
这就是说,这是一个严重有问题的设计

此应用程序的分层结构似乎颠倒了。订单行项目对象应位于低于用户界面层的级别。UI有时可以看到业务对象(订单、订单行项目等),但业务对象不应该知道有关UI的任何信息


如果您可以反转此结构,它将使代码更干净。

假设另一个表单是
Form2
,您可以将
ActiveForm
转换为
Form2

var form2 = ActiveForm as Form2;
if (form2 != null) // form2 == null if ActiveForm is not of type Form2.
{
    form2.sizeComboBox...
}
编辑:
两个音符

  • 创建form2时,最好将form2存储在form1中的成员变量中,而不是获取ActiveForm
  • 您应该将combobox值的获取封装在Form2的属性后面,如
    SelectedFooValue

  • 但是请注意,这不是正确的方法。也许你可以发布你想要实现的目标,我们可以提供帮助?

    你需要将
    ActiveForm
    转换为
    Form1

    我想是这样的(现在没有打开的VS来检查):


    然而,这通常不是一种很好的方法,您不应该让类和结构中的方法引用目录控件,因为这样您就可以将它们紧密地联系在一起。尝试将数据发送到结构,或者在表单上创建一个方法,以某种方式返回数据。

    SizemboBox。根据应用程序启动时传递的参数计算结果,在表单加载事件期间,Items集合将填充不同的项,但此后项不会更改。OrderLineItem结构包含在调用其ToString时需要标签的整数数据。在任何情况下,SizemboBox都包含我需要的所有标签,我在这里询问之前没有提到,我也按照您的建议做了,将当前表单传递到struct构造函数并尝试使用它。我完全忘记了它到底出了什么问题,但我认为是同一个对象引用所需的错误。但是,我没有使用内部关键字。我以前没听说过。现在为了让它工作,我已经公开了所有内容,并将ToString方法放在结构外部,并更改了名称。无法通过嵌套类型访问外部类型的非静态成员,是我在传递对表单的引用时遇到的错误。@slomobile-您应该将
    ActiveForm
    替换为将表单引用传递给构造函数时保存在其中的变量(如我的代码列表所示)。
        public partial class Form1 : Form
    {
        internal static Form1 ActiveForm { get; set; }
    
        public Form1()
        {
            InitializeComponent();
            ActiveForm = this;
        }
    
        public struct OrderLineItem
        {
            public override string ToString()
            {
                return ActiveForm.sizeComboBox.Items[index].ToString();
            }
        }
    
    return someString + ((Form1)ActiveForm).sizeComboBox.Items[index].ToString();