【问题标题】:ASP.Net dropdown always return first value on button click eventASP.Net 下拉菜单总是在按钮单击事件上返回第一个值
【发布时间】:2012-11-11 12:33:27
【问题描述】:

我正在尝试从一个简单的 asp.net 表单中保存价值。

页面上的控件很少,例如下拉菜单和文本框

我用 Language 填充页面加载的第一个下拉菜单并触发 post-bask 以填充第二个下拉列表ddCategoryType 它根据所选语言填充正确的值,但问题是当我尝试要获取 ddCategoryType.SelectedItem.Value 的按钮单击事件值的值,由于某种我现在无法弄清楚的原因,总是返回 0

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ddSelectLanguage.Items.Clear();
        ddSelectLanguage.DataSource = DataProvider.GetLanguages();
        ddSelectLanguage.DataBind();
        ddSelectLanguage.Items.Insert(0, new ListItem("Select Language", "0"));
    }
    else
    {
        ddCategoryType.Items.Clear();
        String strSql = "SELECT TypeName, TypeID FROM  CategoryType WHERE LangID =" + ddSelectLanguage.SelectedItem.Value.ToString();
        DataSet ds = new DataSet();
        ds = DataProvider.Connect_Select(strSql);
        ddCategoryType.DataSource = ds;
        ddCategoryType.DataBind();
        ddCategoryType.Items.Insert(0, new ListItem("Select Type", "0"));
    }
}


protected void btnSaveCategory_Click(object sender, EventArgs e)
{
    objArtCat.LanguageID = int.Parse(ddSelectLanguage.SelectedItem.Value.ToString());
    objArtCat.CategoryName = txtCategoryName.Text;
    objArtCat.CategoryType = int.Parse(ddCategoryType.SelectedItem.Value.ToString());
    objArtCat.CategoryActive = bool.Parse(ddCategoryActive.SelectedItem.Value.ToString());
    try
    {
        //bool result;
        //result = objBLAddArticleCategory.CreateNewArticleCategory(objArtCat);
        //if (result == true)
        //{
        //    Response.Redirect("PageMessage.aspx?msg='Category has been Create Successfully'", true);
        //}
        //else
        //{
        //}
    }
    catch (Exception)
    { }
}

.ASPX 代码示例

   <div  class="row"></div>
              <div class="row">
            <asp:Label ID="lblSelectLang" CssClass="txtLabel"  Text="Select Language  :" runat="server" ></asp:Label>
            <asp:DropDownList ID="ddSelectLanguage" runat="server" CssClass="ddGeneral" 
                      DataTextField="LangName" DataValueField="LangID" CausesValidation="True" 
                      AutoPostBack="True"  >
            </asp:DropDownList>
         <asp:RequiredFieldValidator ID="rfvddLanguage" runat="server" ErrorMessage="Please Select Language"  ControlToValidate="ddSelectLanguage" 
         InitialValue="Select Language" ValidationGroup="atpAddNewArticle" ></asp:RequiredFieldValidator>
       </div>

       <div class="row">
            <asp:Label ID="lblCategoryName" CssClass="txtLabel" runat="server" Text="Category Name :"></asp:Label>
            <asp:TextBox ID="txtCategoryName" runat="server" CssClass="txtbox300"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RFVtxtAuthorName" runat="server" ErrorMessage="*" 
                ControlToValidate="txtCategoryName" ValidationGroup="atpAddNewArticle"  CssClass="validation"></asp:RequiredFieldValidator>
       </div>

       <div class="row">
            <asp:Label ID="lblCategoryType" CssClass="txtLabel" runat="server" Text="Category Type :"></asp:Label>
            <asp:DropDownList ID="ddCategoryType" runat="server" CssClass="ddGeneral"   DataTextField="TypeName" DataValueField="TypeID" >
            </asp:DropDownList>
       </div>

       <div class="row">
            <asp:Label ID="lblCategoryActive" CssClass="txtLabel" runat="server" Text="Category Active :"></asp:Label>
            <asp:DropDownList ID="ddCategoryActive" runat="server" CssClass="ddGeneral"  >
                <asp:ListItem Value="False" Selected="True">NO</asp:ListItem>
                <asp:ListItem Value="True">YES</asp:ListItem>
            </asp:DropDownList>
       </div>

       <div class="rowButton">
            </br>
            <asp:Button ID="btnUpdateArticle" runat="server" Text="Save Category" CssClass="btn"  ValidationGroup="atpAddNewArticle" onclick="btnSaveCategory_Click" />                <input id="Reset" type="reset" class="btn" value="Reset" />
       </div>

回发后 ddCategoryType 的输出

<div class="row">
                <span class="txtLabel" id="MainContent_lblCategoryType">Category Type :</span>
                <select class="ddGeneral" id="MainContent_ddCategoryType" name="ctl00$MainContent$ddCategoryType">
    <option value="0" selected="selected">Select Type</option>
    <option value="1">Article</option>
    <option value="2">News</option>
    <option value="3">Sports</option>
    <option value="4">People</option>
    <option value="5">Message</option>

</select>
           </div>

【问题讨论】:

  • 我会把 DataSet ds = new DataSet();在 String Sql 之前... 然后,您可以将第一个下拉列表设置为 postback=true。请尝试从 Form_load 中删除第二个下拉按钮绑定并将其放在第一个 drop_down 的 SelectedIndexChanged 中? (假设您的第二个 sql 查询返回数据)

标签: asp.net c#-4.0 webforms


【解决方案1】:

在您的Page_Load 中,您正在清除ddCategoryType 的内容,因此SelectedIndex 被重置为0。

请记住,Page_Load 总是被调用,它发生在 Button_Click 事件之前。

有几种方法可以处理这个问题,例如:如果SelectedIndex &gt;= 0

,请不要执行 Page_Load 的 else 子句中的所有代码

【讨论】:

  • 即使我评论那一行它仍然返回零
  • 正如我在回答中所写,将所有 else 子句(与 ddCategoryType 相关)放在检查 SelectedIndex 的 if 语句中。
【解决方案2】:

由于您希望根据从 ddSelectLanguage 中选择的值填充 ddCategoryType,因此请根据该交互而不是在 Page_Load 中填充 DDL。

protected void Page_Load(object sender, EventArgs e)
{
    ddSelectLanguage.SelectedIndexChanged += new
        EventHandler(ddSelectLanguage_SelectedIndexChanged);
    if (!IsPostBack)
    {
        ddSelectLanguage.Items.Clear();
        ddSelectLanguage.DataSource = DataProvider.GetLanguages();
        ddSelectLanguage.DataBind();
        ddSelectLanguage.Items.Insert(0, new ListItem("Select Language", "0"));
    }
}

然后

 void ddSelectLanguage_SelectedIndexChanged(object sender, EventArgs e)
 {
        ddCategoryType.Items.Clear();
        String strSql = "SELECT TypeName, TypeID FROM  CategoryType WHERE LangID =" + ddSelectLanguage.SelectedItem.Value.ToString();
        DataSet ds = new DataSet();
        ds = DataProvider.Connect_Select(strSql);
        ddCategoryType.DataSource = ds;
        ddCategoryType.DataBind();
        ddCategoryType.Items.Insert(0, new ListItem("Select Type", "0"));
 }

另外,让您的查询接受参数。

【讨论】:

  • 您的方法似乎运作良好,但我无法理解您的代码与其他用途建议的代码相比有什么优势,因为它也有效。它看起来更专业,但我无法理解代码的实际工作原理
  • 因为如果他们选择 ddSelectLanguage,选择 ddCategoryType,然后再次选择 ddSelectLanguage,会发生什么?您不会再次重新绑定 ddCategoryType ,因为您的条件不会得到满足。当用户选择 ddSelectLanguage 的新值时,您想绑定/重新绑定 ddCategoryType。 ddSelectLanguage_SelectedIndexChanged 在他们选择新项目时触发...这是您唯一要填充 ddSelectLanguage...所以它更有意义。
  • 谢谢,我现在很清楚我已将您的回复标记为正确,因为它是一种干净的方法
  • 谢谢。在上面的评论中,我的意思是“这是您想要填充 ddCategoryType 的唯一时间”。这种方式有效,如果你离开 Page_Load 它可能会像我提到的那样被破坏。你可以测试看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多