C# asp.net中的枚举字段值不正确
我正在创建一个小ASP.NET应用程序,但一个字段值有问题 我已在类中定义了我的枚举:C# asp.net中的枚举字段值不正确,c#,asp.net,enums,C#,Asp.net,Enums,我正在创建一个小ASP.NET应用程序,但一个字段值有问题 我已在类中定义了我的枚举: class Column { public enum Type { Undefined = 0, Integer = 1, ShortDate = 2, Etc = 3 } // some other stuff } 该应用程序包含一些用于输入列属性的控件,即用于选择列类型的dropdownlist和一些不重要的其他控件。正确输入所有属性后,启用SaveBu
class Column
{
public enum Type {
Undefined = 0,
Integer = 1,
ShortDate = 2,
Etc = 3 }
// some other stuff
}
该应用程序包含一些用于输入列属性的控件,即用于选择列类型的dropdownlist和一些不重要的其他控件。正确输入所有属性后,启用SaveButton in以将列类型信息保存到列表框中。My 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"
}
问题是它总是将“未定义”写入列表框,即使从dropdownlist中选择了其他类型。我试图将该项添加到PrepareToSave()方法内部的列表框中,但效果正常,但我需要它在外部。另一方面,控制是否从dropdownlist中选择了Undefined以外的任何其他值的条件工作良好。似乎selectedType字段仅在PrepareToSave()方法中具有正确的选定值
已启用所有控件的自动回发
我是否遗漏了一些有关枚举的信息,或者您有什么建议如何修复它?谢谢。这很可能是因为您的
if
状况如下所述
if ((ColumnNameTextBox.Text != "") && (ColumnTypeDropDownList.SelectedValue != Column.Type.Undefined.ToString()))
{
而不是
ColumnNameTextBox.Text!=“
使用!string.IsNullOrEmpty(ColumnNameTextBox.Text)
这很可能是由于您的if
条件造成的,如下所述
if ((ColumnNameTextBox.Text != "") && (ColumnTypeDropDownList.SelectedValue != Column.Type.Undefined.ToString()))
{
而不是ColumnNameTextBox.Text!=“
使用!string.IsNullOrEmpty(ColumnNameTextBox.Text)
这只是另一个提示:
在foreach
循环中使用:
foreach (var ct in Enum.GetNames(typeof(Column.Type)))
{
//do your stuff.
}
还有一个提示:
在foreach
循环中使用:
foreach (var ct in Enum.GetNames(typeof(Column.Type)))
{
//do your stuff.
}
你的问题就在这条线上
ColumnTypeDropDownList.Items.Add(new ListItem(ct.ToString()));
…即在新列表项(ct.ToString())
中。使用时,您将创建一个值设置为null
的项。稍后,您将与以下值进行比较:
if (ct.ToString() == ColumnTypeDropDownList.SelectedValue) selectedType = ct;
由于每个项目的Value
均为null
,ColumnTypeDropDownList。SelectedValue
也为null
,比较失败。这也应该在调试器中轻松解决
正确的列表项构造函数是
ListItem listItem = new ListItem(ct.ToString(), ct.ToString());
另一个问题是,您必须在save按钮中调用PrepareToSave
,因为selectedType
字段将在多个请求中丢失其值PrepareToSave
将重建该值。您的问题出在
ColumnTypeDropDownList.Items.Add(new ListItem(ct.ToString()));
…即在新列表项(ct.ToString())
中。使用时,您将创建一个值设置为null
的项。稍后,您将与以下值进行比较:
if (ct.ToString() == ColumnTypeDropDownList.SelectedValue) selectedType = ct;
由于每个项目的Value
均为null
,ColumnTypeDropDownList。SelectedValue
也为null
,比较失败。这也应该在调试器中轻松解决
正确的列表项构造函数是
ListItem listItem = new ListItem(ct.ToString(), ct.ToString());
另一个问题是,您必须在save按钮中调用PrepareToSave
,因为selectedType
字段将在多个请求中丢失其值PrepareToSave
将重建该值。如果要使用自动回发
将隐藏控件添加到页面。
在PrepareToSave()中
method您只需添加selecteType,如yourControlName.Text=ct代码>
并将您的保存处理程序更改为
protected void SaveButton_Click(object sender, EventArgs e)
{
// Read the value of the hidden control
ColumnsListBox.Items.Add(yourControlName.Text);
}
如果要使用自动回邮
将隐藏控件添加到页面。
在PrepareToSave()中
method您只需添加selecteType,如yourControlName.Text=ct代码>
并将您的保存处理程序更改为
protected void SaveButton_Click(object sender, EventArgs e)
{
// Read the value of the hidden control
ColumnsListBox.Items.Add(yourControlName.Text);
}
该字段的值不是在每次回发呼叫时都会重新初始化吗?selectedType属性不是持久的。每次更改下拉索引时,都会进行回发。这意味着您的局部变量将在每次回发时创建。您应该在下拉列表中设置AutoPostback=false
,并通过JS处理按钮的启用/禁用逻辑。不是每次回发调用时都会重新初始化该字段的值吗?selectedType属性不存在。每次更改下拉索引时,都会进行回发。这意味着您的局部变量将在每次回发时创建。您应该在下拉列表中设置AutoPostback=false
,并通过JS处理按钮的启用/禁用逻辑。最后一段是关键。现在它起作用了。然后,我还将foreach循环直接移动到save处理程序,让PrepareToSave
只启用按钮,这样代码就更干净了。谢谢!你的最后一段是关键。现在它起作用了。然后,我还将foreach循环直接移动到save处理程序,让PrepareToSave
只启用按钮,这样代码就更干净了。谢谢!