我正在创建一个小的ASP.NET应用程序并且遇到一个字段值的问题。
我在课堂上定义了我的枚举:
class Column
{
public enum Type {
Undefined = 0,
Integer = 1,
ShortDate = 2,
Etc = 3 }
// some other stuff
}
该应用程序包含一些用于输入列属性的控件,即用于选择列类型的下拉列表和一些不重要的列表。在正确输入所有属性后,SaveButton将启用以将列类型信息保存到列表框中。我的Default.aspx.cs包含:
private Column.Type selectedType;
protected void Page_Load(object sender, EventArgs e)
{
// fill the ColumnTypeDropDownList (from the Column.Type enum)
if (!IsPostBack)
{
foreach (Column.Type ct in Enum.GetValues(typeof(Column.Type)))
{
ColumnTypeDropDownList.Items.Add(new ListItem(ct.ToString()));
}
}
}
protected void ColumnTypeDropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
PrepareToSave();
}
// also called from other controls events, therefore in a separate method
private void PrepareToSave()
{
// control if all needed properties are entered and set the field
if ((ColumnNameTextBox.Text != "") && (ColumnTypeDropDownList.SelectedValue != Column.Type.Undefined.ToString()))
{
foreach (Column.Type ct in Enum.GetValues(typeof(Column.Type)))
{
if (ct.ToString() == ColumnTypeDropDownList.SelectedValue) selectedType = ct;
}
SaveButton.Enabled = true;
}
}
protected void SaveButton_Click(object sender, EventArgs e)
{
ColumnsListBox.Items.Add(selectedType.ToString()); // always writes "Undefined"
}
问题在于它总是将“Undefined”写入列表框,即使从下拉列表中选择了另一种类型。我试图将项目添加到PrepareToSave()方法内的列表框中,并且该方法正常,但我需要在外面。另一方面,控制是否从下拉列表中选择除Undefined之外的任何其他值的条件效果很好。似乎字段selectedType仅在PrepareToSave()方法中具有正确的选定值。
启用所有控件的AutoPostBack。
我是否遗漏了关于枚举的内容,或者您有任何提示如何修复它?感谢。
答案 0 :(得分:0)
这很可能是因为你的if
条件如下所示
if ((ColumnNameTextBox.Text != "") && (ColumnTypeDropDownList.SelectedValue != Column.Type.Undefined.ToString()))
{
而不是ColumnNameTextBox.Text != ""
使用!string.IsNullOrEmpty(ColumnNameTextBox.Text)
答案 1 :(得分:0)
只是另一个提示:
在foreach
循环中使用GetNames
instead of GetValues
:
foreach (var ct in Enum.GetNames(typeof(Column.Type)))
{
//do your stuff.
}
答案 2 :(得分:0)
你的问题在于......
ColumnTypeDropDownList.Items.Add(new ListItem(ct.ToString()));
..即new ListItem(ct.ToString())
。当您使用this constructor of the ListItem
class时,您创建的项目Value
设置为null
。稍后您将比较值:
if (ct.ToString() == ColumnTypeDropDownList.SelectedValue) selectedType = ct;
由于每个项目的Value
为null
,ColumnTypeDropDownList.SelectedValue
也是null
,您的比较失败。这应该也很容易在调试器中找到。
正确的列表项构造函数是
ListItem listItem = new ListItem(ct.ToString(), ct.ToString());
作为一个额外问题,您必须在PrepareToSave
中致电SaveButton_Click
,因为selectedType
字段会在请求中丢失其值。 PrepareToSave
将重建该值。
答案 3 :(得分:0)
如果您想使用AutoPostBack ...
为您的页面添加隐藏控件。
在PrepareToSave();
方法中,您只需添加 selectetType ,例如yourControlName.Text = ct;
并将保存处理程序更改为此....
protected void SaveButton_Click(object sender, EventArgs e)
{
// Read the value of the hidden control
ColumnsListBox.Items.Add(yourControlName.Text);
}