禁用Page_Load网格视图中的复选框
本文关键字:复选框 视图 网格 Page Load 禁用 | 更新日期: 2023-09-27 18:37:25
我想
禁用网格视图内部的网格视图复选框。
我尝试如下:-
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>
好吧,你没有说你正在使用 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 上有此类函数的示例(例如,获取特定类型的所有控件或使用 Enumerable.OfType
最后一步是箍箍到行被限定时调用的事件。为此,我使用了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 将保持与控件是客户端一样。
代码未经测试,但希望对您有所帮助。
您可以更改复选框并制作这些 asp:CheckBox,以便您可以在代码隐藏中禁用它,如下所示:
将 OnRowDataBound 事件处理到 GridView
<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);
}
}
> 100% 工作 简单,只需在页面加载事件后绑定您的新人视图方法即可,如下所示
protected void Page_LoadComplete(object sender, EventArgs e)
{
DisableFormControls(Form.Controls);
}
从页面加载中删除此方法并使用上述事件
如果有任何语法错误。
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
}