1

我正在用 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

4 回答 4

0

该结构知道它包含的类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();
     }   
    } 
} 

也就是说,这是一个非常有问题的设计。

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

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

于 2010-11-30T19:54:07.420 回答
0

假设另一种形式是Form2您可以ActiveForm转换为Form2

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

编辑:
两个注释。

  1. 与其获取 ActiveForm,不如在创建 form2 时将 form2 存储在 form1 的成员变量中。
  2. 您应该将组合框值的获取封装在 Form2 中的属性后面,例如SelectedFooValue.
于 2010-11-30T19:54:24.367 回答
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();
        }
    }

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

于 2010-11-30T19:54:48.293 回答
0

您需要转换ActiveFormForm1.

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

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

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

于 2010-11-30T19:58:44.950 回答