如何从嵌套struct的ToString方法中访问表单控件

时间:2010-11-30 19:44:16

标签: c# nested-class

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

public partial class Form1 : Form
{
 public struct OrderLineItem
    {
     string someString;
     int index;
     string ToString()
        {return someString + ActiveForm.sizeComboBox.Items[index].ToString();}  
    }
}

它抱怨它无法找到sizeComboBox的定义。如果我明确使用表单的名称,它说静态字段需要一个对象引用... 我不太清楚这意味着什么。使用this.sizeComboBox是指结构,而不是表单。再次使用sizeComboBox,需要一个对象引用。

4 个答案:

答案 0 :(得分:0)

struct知道它包含的类 type ,但它不知道该类型的任何特定实例,除非你告诉它。例如,您可以创建一个采用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的任何信息。

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

答案 1 :(得分:0)

假设另一个表单Form2您可以ActiveForm投放到Form2

var form2 = ActiveForm as Form2;
if (form2 != null) // form2 == null if ActiveForm is not of type Form2.
{
    form2.sizeComboBox...
}

修改
两个音符。

  1. 创建form2时,最好不要将form2存储在form1中的成员变量中。
  2. 您应该将组合框值的获取封装在Form2中的属性后面,例如SelectedFooValue

答案 2 :(得分:0)

    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();
        }
    }

但请注意,这不是正确的方法。也许你可以发布你想要完成的事情,我们可以提供帮助吗?

答案 3 :(得分:0)

您需要将ActiveForm投射到Form1

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

return someString + ((Form1)ActiveForm).sizeComboBox.Items[index].ToString();

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