asp.net中的枚举字段值不佳

时间:2017-11-27 12:14:27

标签: c# asp.net enums

我正在创建一个小的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。

我是否遗漏了关于枚举的内容,或者您​​有任何提示如何修复它?感谢。

4 个答案:

答案 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;

由于每个项目的ValuenullColumnTypeDropDownList.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);   
}