【问题标题】:Disabling PostBack for blank/default ListItem in DataBound DropDownList为 DataBound DropDownList 中的空白/默认 ListItem 禁用 PostBack
【发布时间】:2011-09-26 00:09:09
【问题描述】:

我有一个从数据源填充的 DropDownList。绑定后,我在列表顶部放置一个空字段,以便它对用户显示为空白(创建一种“默认项”)。我有一些处理 SelectedIndexChanged 事件的代码,但如果用户要选择空的 ListItem,则不需要执行它。

这是我的代码:

.aspx

<asp:DropDownList ID="dropDownList" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dropDownList_SelectedIndexChanged">
</asp:DropDownList>  

添加空白 ListItem 的 C# 代码隐藏

dropDownList.Items.Insert(0, new ListItem(String.Empty, String.Empty));
dropDownList.SelectedIndex = 0;

由于我不需要页面在用户仅单击此特定索引时进行回发,因此我想为此列表项完全禁用回发。这甚至可能吗?如果是这样,怎么做?

【问题讨论】:

    标签: c# asp.net drop-down-menu postback


    【解决方案1】:

    能否添加一个 onChange 属性来运行一个 JS 函数,该函数在回发之前检查值是否为空?

    dropDownList.Attributes.Add("onChange", "javascript: return ddlChange()");
    
    function ddlChange
    {
        if(document.getElementById("<%= dropDownList.ClientID %>").value == "")
            return false;
    
        return true;
    }
    

    【讨论】:

    • 由于某种原因,它为每个 ListItem 返回 false?
    【解决方案2】:

    设置disabled="disabled",这将使项目不可选(并且不回发)

    <asp:DropDownList runat="server" ID="dddl">
        <asp:ListItem Text="" disabled="disabled" Selected="True"></asp:ListItem>
        <asp:ListItem Text="test"></asp:ListItem>
    </asp:DropDownList>
    

    或者,如果您希望能够选择第一个(空)项目但不执行回发,请执行以下操作:

    <asp:DropDownList runat="server" ID="dddl" AutoPostBack="true" onchange="if(this.selectedIndex == 0)return false;">
        <asp:ListItem Text="" Selected="True"></asp:ListItem>
        <asp:ListItem Text="test"></asp:ListItem>
    </asp:DropDownList>
    

    【讨论】:

    • 这将使它甚至不显示...我希望它出现,并且可以选择,只是什么都不做。
    • 对不起,应该是disabled="disabled"
    • 我必须从我的代码隐藏中执行此操作,因为我正在对下拉列表进行数据绑定(完成后会清除所有现有的列表项)。当我尝试从代码隐藏中执行此操作时,我被告知列表项没有“禁用”属性。
    • Attributes.Add 不起作用...但是,您的替代方法成功了!简单有效! :D 谢谢!
    【解决方案3】:

    您可以添加必填字段验证器。然后将 DropDownList 的 CausesValidation 属性设置为 true。这将防止回发并提供最终用户反馈。

        <asp:DropDownList ID="dropDownList" runat="server" AutoPostBack="true"  OnSelectedIndexChanged="dropDownList_SelectedIndexChanged" CausesValidation="true">
        </asp:DropDownList>
        <asp:RequiredFieldValidator ID="rfvDropDownList" runat="server" ErrorMessage="Must select a value!" ControlToValidate="dropDownList" />
    

    【讨论】:

      【解决方案4】:

      1.web控件使用postback,添加属性取消postback。 但不会选择选项。

      protected void rblRecentOrder_DataBound(object sender, EventArgs e)
      {
          RadioButtonList rbl = sender as RadioButtonList;
          ListItem itemX = rbl.Items.FindByText("NA");
          // if no NA item then add it
          if (itemX == null)
          {
             itemX = new ListItem("NA");
             // set item cancel postback, but option will not be selected
             itemX.Attributes.Add("onclick", "return false;");
          }
      }
      

      2.或者在需要的时候使用javacsript调用回发

      <script>
      function myPostback() {
           // call asp.net postback
           __doPostBack('tagName', 'params');
      }
      
      // TextBox
      function updateValue(id, value) {
          let obj = document.getElementById(id);
          obj.value = value;
      }
      
      // Label
      function updateInnerHTML(id, value) {
          var obj = document.getElementById(id);
          obj.innerHTML = value;
      }
      
      // DrowdownList
      function setSelectOption(id, value) {
          let obj = document.getElementById(id);
          if (obj)
              obj.value = value;
      }
      
      // RadioButtonList
      function selectRadio(id) {
          let obj = document.getElementById(id);
          // input type=radio
          if (obj) {
              let items = obj.getElementsByTagName("INPUT");
              for (var i = 0; i < items.length; i++) {
                  items[i].checked = true;
              }
          }
      }
      </script>
      
      c#
      switch(Request.Form["__EVENTTARGET"])
      {
          case "tageName":
              var params = Request.Form["__EVENTARGUMENT"];
              //..........
              break;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-12
        • 1970-01-01
        • 2014-02-09
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多