我正在用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,需要一个对象引用。
答案 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...
}
修改强>
两个音符。
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();
但是,这通常不是一个很好的方法,你不应该在你的类和结构中将你的方法引用到控件目录,因为那时你将它们紧密地绑在一起。尝试将数据发送到结构中,或者在表单上创建一个方法以某种方式返回数据。