【问题标题】:Show/Hide Gridview controls when clicks on checkbox - Javascript单击复选框时显示/隐藏 Gridview 控件 - Javascript
【发布时间】:2019-02-15 22:06:32
【问题描述】:

我的 gridview 第一列包含一个 tetxbox 和标签。第二列包含复选框。当用户单击“check_all”复选框时,应显示所有行的文本框。最初它被设置为不可见。标签也应该消失。 当用户点击每一行的单个复选框时,相应的文本框应该出现并且标签应该消失。如何使用 javascript 实现这一点?

<asp:TemplateField  
         HeaderText="Add Note" 
         itemstyle-horizontalalign="Center"  >
    <ItemTemplate>
         <asp:Label ID="Label1" 
                    runat="server" 
                    Text='<%# Eval("notes") %>'>
          </asp:Label>
          <asp:TextBox ID="TextBox1" 
                       runat="server" 
                       Width="100px" 
                       Text='<%# Eval("notes") %>' 
                       Visible="false">
           </asp:TextBox> 
     </ItemTemplate>
           <HeaderStyle HorizontalAlign="Center" 
                        VerticalAlign="Middle" 
                        Width="60px"/>
            <ItemStyle  HorizontalAlign="Center"  
                        Width="60px">
            </ItemStyle>
</asp:TemplateField>

<asp:TemplateField HeaderStyle-HorizontalAlign="Center">
         <HeaderTemplate>
               <asp:CheckBox ID="check_all"  
                             onclick="ShowHideChkBx(this)"  
                             runat="server" 
                             EnableViewState="true" 
                             CssClass="gridcheckbox"  />
          </HeaderTemplate>
          <ItemTemplate>
                  <asp:CheckBox ID="CheckBox1"
                                onclick="ShowHideChkBx(this)"
                                runat="server" Checked="false"  />
           </ItemTemplate>
</asp:TemplateField>

Javascript 代码:

      function ShowHideChkBx(ele) {

        var GridView = document.getElementById('<%=GridView1.ClientID %>')
        var checkBoxes = GridView.getElementsByTagName("input");
        for (i = 1; i < GridView.rows.length; i++) {

        }
        if (ele.checked) { //to check all checkboxes when user clicks on check_all
            for (var i = 1; i < checkBoxes.length; i++) {
                if (checkBoxes[i].type == "checkbox") {
                    checkBoxes[i].checked = true;
                }
                if (checkBoxes[i].type == "text") {
                    checkBoxes[i].disabled = false;
                }
            }
        }
        else
        {
            for (var i = 1; i < checkBoxes.length; i++) {
                if (checkBoxes[i].type == "checkbox") {
                    checkBoxes[i].checked = false;
                }
            }
        }
      }

【问题讨论】:

  • aspnet Visible=false 属性与style=display:none 之类的前端css 不同。当可见性设置为 false 时,前端不存在 TextBox/
  • 最初我不需要在前端显示 tetxbox。当用户点击复选框时需要通过js使其可见
  • 这正是我的观点。如果可见性设置为 false,则无法使用 js 执行此操作。使用&lt;asp:TextBox style="display:none" Visible="true"。然后就可以用js展示了。
  • 哦,好的。我将会。当用户单击复选框时,如何控制文本块和 javascript 上的标签?

标签: javascript asp.net gridview


【解决方案1】:

它可以写得更好,但基本上你的 Javascript 应该是这样的:

// Add a shim for browsers not supporting .closest()
if (window.Element && !Element.prototype.closest) {
    Element.prototype.closest =
    function(s) {
        var matches = (this.document || this.ownerDocument).querySelectorAll(s),
            i,
            el = this;
        do {
            i = matches.length;
            while (--i >= 0 && matches.item(i) !== el) {};
        } while ((i < 0) && (el = el.parentElement));
        return el;
    };
}

function onCheckboxClick(el) {
    var row = el.closest('tr'); // current row
    var textbox = row.querySelector("#TextBox1"); // textbox in the same row
    var label = row.querySelector("#Label1"); // label in the same row

    // if current checkbox is checked show textbox and hide label
    if (el.checked) {
      textbox.style.visibility = "visible";
      label.style.visibility = "hidden";
    // if current checkbox is unchecked hide textbox and show label
    } else {
      textbox.style.visibility = "hidden";
      label.style.visibility = "visible";
    }
}

只记得更改复选框上的处理程序:

<asp:CheckBox ID="CheckBox1"  onclick="onCheckboxClick(this)"  runat="server" Checked="false"  />

【讨论】:

  • 我试过这个,但是 textbox.style.visibility = "visible"; label.style.visibility = "隐藏";不管用。我在 gridview 中有许多其他列。这可能是原因吗?
  • onCheckboxClick 仅在单击的复选框的同一行上运行。实际上你可以显示/隐藏任何 HTML 元素,见jsfiddle.net/ifthenelse/93maogcp/8
  • var textbox = row.querySelector("input[type='textbox']");我可以将文本框 ID(这里是 TextBox1)传递给这个吗?我在同一行上有多个文本框。所以需要指定文本框id
  • 是的,您可以使用任何 css 选择器,它会返回第一个匹配项。
  • 如果需要所有匹配项,请使用 el.querySelectorAll()
猜你喜欢
  • 1970-01-01
  • 2018-03-30
  • 2012-11-16
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多