Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net中的枚举字段值不正确_C#_Asp.net_Enums - Fatal编程技术网

C# 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

我正在创建一个小ASP.NET应用程序,但一个字段值有问题

我已在类中定义了我的枚举:

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
只启用按钮,这样代码就更干净了。谢谢!