【问题标题】:Disabling of checkBoxes inside gridview on Page_Load在 Page_Load 上的 gridview 中禁用复选框
【发布时间】:2016-06-19 01:24:02
【问题描述】:

我想要

禁用gridview内部的gridview复选框。

我尝试如下:-

public static void DisableFormControls(ControlCollection ChildCtrls)
{
    foreach (Control Ctrl in ChildCtrls)
    {
        if (Ctrl is Obout.Grid.Grid)
            ((Obout.Grid.Grid)Ctrl).Enabled = false;
        if (Ctrl is HtmlGenericControl)
            ((HtmlGenericControl)Ctrl).Disabled = true;
    }
}

Page_load

protected void Page_Load(object sender, EventArgs e)
{ 
    if (Request.QueryString["userid"] != null && Request.QueryString["userid"] != "")
    {
        Hid_userid.Value = Request.QueryString["userid"];
        Hid_HR.Value = "Y";
        FundiableEnable();

        DisableFormControls(Form.Controls);
    }
}

但这对我不起作用。知道代码有什么问题

这是我的 GridView 的 html:

<cc1:Grid ID="GrdWorkingCompany" runat="server"  EnableTypeValidation="true" CallbackMode="true"
    ShowFooter="false" AutoGenerateColumns="false" AllowAddingRecords="true" AllowSorting="false"
    Width="100%" FolderStyle="~/Styles/Grid/style_12" PageSize="18">
    <Columns>
        <cc1:Column ID="Sr_No" ReadOnly="true" DataField="SrNo" HeaderText="Sr.No." Width="50px">
        </cc1:Column>
        <cc1:Column ID="Points" ReadOnly="true" DataField="Points" HeaderText="Points" runat="server" Width="300px">
        </cc1:Column>
        <cc1:Column ID="chkPoor" ReadOnly="true" DataField="Rating1" HeaderText="Poor" Width="110px" TemplateId="tpltPoor">
        </cc1:Column> 
        <cc1:Column ID="chkSatisfactory" DataField="Rating2" HeaderText="Satisfactory" ReadOnly="true"
            Width="110px" TemplateId="tpltSatisfactory">
        </cc1:Column>
        <cc1:Column ID="chkGood" ReadOnly="true" HeaderText="Good" DataField="Rating3" Width="110px" TemplateId="tpltGood">
        </cc1:Column>
        <cc1:Column ID="chkExcellent" HeaderText="Excellent" DataField="Rating4" Width="110px" ReadOnly="true"
            TemplateId="tpltEx1">
        </cc1:Column>
    </Columns>
    <TemplateSettings GroupHeaderTemplateId="GroupTemplate" />
    <Templates>
        <cc1:GridTemplate runat="server" ID="GridTemplate2">
            <Template>
                <%# Container.Column.HeaderText %>
                : <i>
                    <%# Container.Value %></i> (<%# Container.Group.PageRecordsCount %><%# Container.Group.PageRecordsCount > 1 ? "records" : "record" %>)
            </Template>
        </cc1:GridTemplate>
    </Templates>
    <Templates>
        <cc1:GridTemplate ID="tpltPoor">
            <Template>
                <input type="checkbox" id="chkA1<%# (Container.RecordIndex)%>" name="chkAC1" style="width: 17px; 
                    height: 17px;" value="<%# (Container.RecordIndex)%>" onclick="AppoveCheckA(this)" /></Template>
        </cc1:GridTemplate>
        <cc1:GridTemplate ID="tpltSatisfactory">
            <Template>
                <input type="checkbox" id="chkA2<%# (Container.RecordIndex) %>" name="chkAC2" style="width: 17px;
                    height: 17px;" value="<%# (Container.RecordIndex)%>" onclick="AppoveCheckA(this)" /></Template>
        </cc1:GridTemplate>
        <cc1:GridTemplate ID="tpltGood">
            <Template>
                <input type="checkbox" id="chkA3<%# (Container.RecordIndex) %>" name="chkAC3" style="width: 17px;
                    height: 17px;" value="<%# (Container.RecordIndex)%>" onclick="AppoveCheckA(this)" /></Template>
        </cc1:GridTemplate>
        <cc1:GridTemplate ID="tpltEx1">
            <Template>
                <input type="checkbox" id="chkA4<%# (Container.RecordIndex) %>" name="chkAC4" style="width: 17px;
                    height: 17px;" value="<%# (Container.RecordIndex)%>" onclick="AppoveCheckA(this)" /></Template>
        </cc1:GridTemplate>
    </Templates>
</cc1:Grid>

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    代码未经测试,但希望对您有所帮助。

    您可以更改您的复选框并制作这些 asp:CheckBox 以便您可以在后面的代码中禁用它,如下所示:

    为您的 GridView 处理 OnRowDataBound 事件

    <cc1:Grid ID="GrdWorkingCompany" runat="server"  EnableTypeValidation="true" CallbackMode="true"
        ShowFooter="false" AutoGenerateColumns="false" AllowAddingRecords="true" AllowSorting="false"
        Width="100%" FolderStyle="~/Styles/Grid/style_12" PageSize="18" OnRowDataBound="GrdWorkingCompany_RowDataBound">
    
    <Template>
        <asp:CheckBox ID="cbTest" runat="server" />
    </Template>
    

    在您的代码中,您应该像这样启用或禁用您的复选框:

    protected void GrdWorkingCompany_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        CheckBox chkbox = (CheckBox)e.Row.FindControl("cbTest");
        chekbox.Enable = false; 
    }
    

    方法2,你可以创建一个jquery函数,在你的代码后面调用,如下所示:

    <script type="text/javascript" src="//code.jquery.com/jquery-1.12.0.min.js"></script>
    <script type="text/javascript">
        function DisableAllCheckBox() {
            $('#<%=GrdWorkingCompany.ClientID %>').find("input:checkbox").each(function () {
                $(this).attr("disabled", true);
            });
        }
    </script>
    

    并在后面的代码中调用该函数:

    protected void Page_Load(object sender, EventArgs e)
    { 
        if (Request.QueryString["userid"] != null && Request.QueryString["userid"] != "")
        {
            Hid_userid.Value = Request.QueryString["userid"];
            Hid_HR.Value = "Y";
            FundiableEnable();
    
            //DisableFormControls(Form.Controls);
            Page.ClientScript.RegisterStartupScript(this.GetType(),"TEST", "DisableAllCheckBox()",true);
        }
    }
    

    【讨论】:

    • 我尝试了第二个,但它也不起作用。将this.attr("disabled", true); 设为未定义
    • 您确定您的 jquery 引用正确吗?请查看我对 jquery src 的编辑。
    • 是的,jquery 被正确引用。但它仍然没有接受它
    【解决方案2】:

    100% 工作简单,只需像这样在页面加载事件后绑定您的网格视图方法

    protected void Page_LoadComplete(object sender, EventArgs e)
    {
         DisableFormControls(Form.Controls);
    }
    

    从页面加载中删除此方法并使用上述事件

    【讨论】:

      【解决方案3】:

      好吧,您没有说您使用的是 OBOUT ASP.NET Grid 而不是默认的网格控件。在这种情况下,这很重要。但是,我手动重新创建了您的示例,这就是我使其工作的方式。

      首先,我将您的网格代码更改为对复选框使用服务器控件:

      <cc1:Grid ID="GrdWorkingCompany" runat="server" EnableTypeValidation="true" CallbackMode="true" Serialize="true"
          ShowFooter="false" AutoGenerateColumns="false" AllowAddingRecords="true" AllowSorting="false"
          Width="100%" FolderStyle="~/Styles/Grid/style_12" PageSize="18">
          <Columns>
              <cc1:Column ID="Sr_No" ReadOnly="true" DataField="SrNo" HeaderText="Sr.No." Width="50px">
              </cc1:Column>
              <cc1:Column ID="Points" ReadOnly="true" DataField="Points" HeaderText="Points" runat="server" Width="300px">
              </cc1:Column>
              <cc1:Column ID="chkPoor" ReadOnly="true" DataField="Rating1" HeaderText="Poor" Width="110px" TemplateId="tpltPoor">
              </cc1:Column>
              <cc1:Column ID="chkSatisfactory" DataField="Rating2" HeaderText="Satisfactory" ReadOnly="true"
                  Width="110px" TemplateId="tpltSatisfactory">
              </cc1:Column>
              <cc1:Column ID="chkGood" ReadOnly="true" HeaderText="Good" DataField="Rating3" Width="110px" TemplateId="tpltGood">
              </cc1:Column>
              <cc1:Column ID="chkExcellent" HeaderText="Excellent" DataField="Rating4" Width="110px" ReadOnly="true"
                  TemplateId="tpltEx1">
              </cc1:Column>
          </Columns>
          <TemplateSettings GroupHeaderTemplateId="GroupTemplate" />
          <Templates>
              <cc1:GridTemplate runat="server" ID="GridTemplate2">
                  <Template>
                      <%# Container.Column.HeaderText %>
                  : <i>
                      <%# Container.Value %></i> (<%# Container.Group.PageRecordsCount %><%# Container.Group.PageRecordsCount > 1 ? "records" : "record" %>)
                  </Template>
              </cc1:GridTemplate>
          </Templates>
          <Templates>
              <cc1:GridTemplate ID="tpltPoor">
                  <Template>
                      <input type="checkbox" id="chkA1" name="chkAC1" style="width: 17px; height: 17px;"
                          value="<%# (Container.RecordIndex)%>" onclick="AppoveCheckA(this)" runat="server"/>
                  </Template>
              </cc1:GridTemplate>
              <cc1:GridTemplate ID="tpltSatisfactory">
                  <Template>
                      <input type="checkbox" id="chkA2" name="chkAC2" style="width: 17px; height: 17px;"
                          value="<%# (Container.RecordIndex)%>" onclick="AppoveCheckA(this)" runat="server"/>
                  </Template>
              </cc1:GridTemplate>
              <cc1:GridTemplate ID="tpltGood">
                  <Template>
                      <input type="checkbox" id="chkA3" name="chkAC3" style="width: 17px; height: 17px;"
                          value="<%# (Container.RecordIndex)%>" onclick="AppoveCheckA(this)" runat="server"/>
                  </Template>
              </cc1:GridTemplate>
              <cc1:GridTemplate ID="tpltEx1">
                  <Template>
                      <input type="checkbox" id="chkA4" name="chkAC4" style="width: 17px; height: 17px;"
                          value="<%# (Container.RecordIndex)%>" onclick="AppoveCheckA(this)" runat="server"/>
                  </Template>
              </cc1:GridTemplate>
          </Templates>
      </cc1:Grid>
      

      您无需担心 Id 重复,因为 ASP.NET 会在客户端生成适当的 Id。有必要为复选框用户服务器控件,因为如果您使用通用 html 标记,它将为每个复选框创建 DataBoundLiteralCOntrol,并且不方便在后面的代码中更改其代码(它们被视为静态文本)。如果我们使用服务器控件,我们可以在后面的代码中访问它们的属性 - 在这种情况下,将为每个复选框创建 HtmlInputCheckBox。

      然后我迭代每一行并寻找复选框控件:

      private void GrdWorkingCompany_RowDataBound(object sender, Obout.Grid.GridRowEventArgs e)
          {
              foreach (Obout.Grid.Column column in GrdWorkingCompany.Columns)
              {
                  if (!string.IsNullOrEmpty(column.TemplateId))
                  {
                      var cell = e.Row.Cells[column.Index] as Obout.Grid.GridDataControlFieldCell;
                      var checkBoxControls = cell.FindControlsByType(typeof(HtmlInputCheckBox));
                      if (checkBoxControls.Count > 0)
                      {
                          var checkbox = checkBoxControls[0] as HtmlInputCheckBox;
                          checkbox.ClientIDMode = ClientIDMode.Static;
                          checkbox.ID = checkbox.ID + e.Row.RowIndex;
                          checkbox.Attributes.Add("disabled", "true");
                      }
                  }
              }
          }
      

      我只检查列中定义了 TemplateId 的单元格,因为 FindControlsByType 如果找不到任何控件会抛出错误。所以我假设每个模板列至少有一个复选框。如果您需要更灵活的方法,您可以定义自己的函数,类似于 FindControlsByType - StackOverflow 上有此类函数的示例(例如 Get all controls of a specific typeFind all child controls of specific type using Enumerable.OfType<T>() or LINQ)。找到合适的控件后,您可以添加自定义属性。

      最后一步是连接到当行有界时调用的事件。为此,我使用了 Page_Load 事件:

      protected void Page_Load(object sender, EventArgs e)
      {
          GrdWorkingCompany.RowDataBound += GrdWorkingCompany_RowDataBound;
      
          if (!IsPostBack)
          {
              GrdWorkingCompany.DataSource = new List<Test>() { new Test(), new Test() };
              GrdWorkingCompany.DataBind();
          }
      
      }
      

      我的测试课:

      public class Test
      {
          public string SrNo { get; set; }
          public string Points { get; set; }
          public string Rating1 { get; set; }
          public string Rating2 { get; set; }
          public string Rating3 { get; set; }
          public string Rating4 { get; set; }
      }
      

      更新: 在与@coder 交谈后,他告诉我复选框的 ID 需要与我更改服务器控件之前完全相同。为了做到这一点,我在下面向 GrdWorkingCompany_RowDataBound 方法添加了代码:

      checkbox.ClientIDMode = ClientIDMode.Static;
      checkbox.ID = checkbox.ID + e.Row.RowIndex;
      

      有了这个,复选框的 id 将保持与控件在客户端相同。

      【讨论】:

      • 感谢 lesmian 的回答,但它不起作用。但是您的答案似乎几乎可以解决。调试时的一件事我得到了cell""
      • @coder 确保附加 GrdWorkingCompany.RowDataBound += GrdWorkingCompany_RowDataBound;在数据绑定到网格控件之前。你说你在这一行得到 null 作为单元格值: var cell = e.Row.Cells[column.Index]?
      • 是的,它是 null。但我在循环中得到TemplateId
      • 我也尝试过这个链接,obout.com/grid/KnowledgeBase.aspx?id=1008,但它没有用。有什么帮助吗?。
      • @coder 查看我更新的 Page_Load 事件。为了使它工作,我在 GrdWorkingCompany.DataBind(); 之前附加了 RowDataBound;你是按照同样的顺序做的吗?
      【解决方案4】:

      如有语法错误,请见谅。

      function DisableControls() {
              //Get target base & child control.
              var TargetBaseControl =
              document.getElementById('<%= this.grid.ClientID %>');
              var TargetChildControl = "chkA";
      
              //Get all the control of the type INPUT in the base control.
              var Inputs = TargetBaseControl.getElementsByTagName("input");
      
              //disable or enable all the checkBoxes in side the Grid.
              for (var n = 0; n < Inputs.length; ++n)
                  if (Inputs[n].type == 'checkbox' && Inputs[n].id.indexOf(TargetChildControl, 0) >= 0)
                      Inputs[n].disabled= false; //i am not sure if this is the correct syntax for disabling
          }
      

      【讨论】:

      • 我看不出获得赞成票和反对票的意义。这是我在一个项目中拥有的工作代码。唯一的区别是我没有禁用复选框,而是设置了checked = true。投反对票的理由是公平的。 ://
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      相关资源
      最近更新 更多