DevExpress Legacy ASPxGridView:如何让列 header CheckBox 全部选中或全部清除;也有单独的行 CheckBoxes 影响 header CheckBox?
DevExpress Legacy ASPxGridView: How to have column header CheckBox check all or clear all; also have individual row CheckBoxes affect header CheckBox?
请原谅这个看似重复的问题,但经过两个小时并仔细研究了几个代码示例后,我还没有看到一个真正适合我的问题。
我有一个正在为之工作的客户,它具有经典的 UI 需求,需要一个第一列为复选框的网格...带有一个复选框 header,单击后可以select 每个数据行中的所有(或清除所有)其他复选框。如果选中单个行的复选框,他们希望该状态反映在 header 复选框中;即 header 复选框只有在所有其他可见行都被选中时才会被选中。我也希望能够(当然)根据服务器端的 checked/selected 行执行一些操作。
我只能使用他们的 currently-licensed 版本的 DevExpress 控件,即 12.2.5,而且我当然使用 ASPxGridView,因为这是一个 Web 应用程序。正如我已经说过的,在查看了几个代码示例后,我似乎无法使它正常工作。我粘贴了我正在处理的代码的简化版本,希望我能在这里得到一些指导。 (注意:请不要提出 "upgrade to the latest version" 之类的建议,我这里没有可用的选项!)在此先感谢您的帮助。
巴里·坎普
代码如下:
ASPX 页面
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="TestPage.aspx.vb" Inherits="TestApp.TestPage" %>
<%@ Register assembly="DevExpress.Web.v12.2, Version=12.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" namespace="DevExpress.Web.ASPxGridView" tagprefix="dx" %>
<%@ Register assembly="DevExpress.Web.v12.2, Version=12.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" namespace="DevExpress.Web.ASPxEditors" tagprefix="dx" %>
<!doctype html />
<html>
<head>
<script type="text/javascript">
function checkAllCheckBox_OnCheckedChanged(sender, e) {
var checked = sender.GetChecked();
// Loop to set all checkboxes to column header checkbox state...?
}
</script>
</head>
<body>
<dx:ASPxGridView ID="SomeInformationGridView" runat="server" KeyFieldName="ID" ClientInstanceName="grid" AutoGenerateColumns="False" SettingsPager-Mode="ShowPager" SettingsPager-PageSize="50" style="width: 95%;">
<SettingsBehavior AllowGroup="false" AllowDragDrop="false" />
<Columns>
<dx:GridViewCommandColumn ShowSelectCheckbox="true" VisibleIndex="0" Width="32px" CellStyle-HorizontalAlign="Center">
<HeaderTemplate>
<dx:ASPxCheckBox ID="CheckAllCheckBox" runat="server" AutoPostBack="false" clientinstancename="checkAllCheckBox" OnInit="CheckAllCheckBox_Init">
<ClientSideEvents CheckedChanged="checkAllCheckBox_OnCheckedChanged" />
</dx:ASPxCheckBox>
</HeaderTemplate>
<HeaderStyle HorizontalAlign="Center" />
</dx:GridViewCommandColumn>
<dx:GridViewDataTextColumn FieldName="ID" VisibleIndex="1" Visible="false" ReadOnly="true" CellStyle-HorizontalAlign="Center">
<HeaderStyle HorizontalAlign="Center" />
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="SomeOtherData" VisibleIndex="2" Visible="true" ReadOnly="true" CellStyle-HorizontalAlign="Center">
<HeaderStyle HorizontalAlign="Center" />
</dx:GridViewDataTextColumn>
<--! Other Columns Here -->
</Columns>
</dx:ASPxGridView>
</body>
</html>
VB Code-Behind
Imports System
Imports System.Web.UI
Imports DevExpress.Web.ASPxEditors
Imports DevExpress.Web.ASPxGridView
Partial Public Class TestPage
Inherits Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Dim gridView As ASPxGridView = CType(Me.FindControl("SomeInformationGridView"), ASPxGridView)
gridView.DataSource = GetMyInformation()
gridView.DataBind()
End Sub
Protected Sub CheckAllCheckBox_Init(sender As Object, e As EventArgs)
Dim checkBox As ASPxCheckBox = sender
Dim grid As ASPxGridView = SomeInformationGridView ' CType(Me.FindControl("SomeInformationGridView"), ASPxGridView)
checkBox.Checked = (grid.Selection.Count = grid.VisibleRowCount)
End Sub
Private Function GetMyInformation()
' Reads the data to be bound to the grid.
End Function
End Class
尝试在 gridheader 模板中添加以下 js 和 html 调用:
//javascript function
function CheckAll(chkBx, gvID)
{
var gv = document.getElementById(gvID);
for (i = 1; i < gv.rows.length; i++) {
if (gv.rows[i].style.display != 'none') {
gv.rows[i].cells[0].getElementsByTagName("INPUT")[0].checked = chkBx.checked;
}
};
};
//add this to your grid header template
<HeaderTemplate>
<asp:CheckBox ID="chkAllAvail" ToolTip="Select all" runat="server" onclick="CheckAll(this, 'SomeInformationGridView');" Visible="true" />
</HeaderTemplate>
I am constrained to using their currently-licensed version of the DevExpress controls which is 12.2.5
是的,如果您使用的是这样的旧版本,则有必要使用一堆代码来模拟此功能。
查看 OBSOLETE - ASPxGridView - How to implement SelectRows and SelectAllRowsOnPage CheckBox features 说明以了解如何完成此操作。
请原谅这个看似重复的问题,但经过两个小时并仔细研究了几个代码示例后,我还没有看到一个真正适合我的问题。
我有一个正在为之工作的客户,它具有经典的 UI 需求,需要一个第一列为复选框的网格...带有一个复选框 header,单击后可以select 每个数据行中的所有(或清除所有)其他复选框。如果选中单个行的复选框,他们希望该状态反映在 header 复选框中;即 header 复选框只有在所有其他可见行都被选中时才会被选中。我也希望能够(当然)根据服务器端的 checked/selected 行执行一些操作。
我只能使用他们的 currently-licensed 版本的 DevExpress 控件,即 12.2.5,而且我当然使用 ASPxGridView,因为这是一个 Web 应用程序。正如我已经说过的,在查看了几个代码示例后,我似乎无法使它正常工作。我粘贴了我正在处理的代码的简化版本,希望我能在这里得到一些指导。 (注意:请不要提出 "upgrade to the latest version" 之类的建议,我这里没有可用的选项!)在此先感谢您的帮助。
巴里·坎普
代码如下:
ASPX 页面
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="TestPage.aspx.vb" Inherits="TestApp.TestPage" %>
<%@ Register assembly="DevExpress.Web.v12.2, Version=12.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" namespace="DevExpress.Web.ASPxGridView" tagprefix="dx" %>
<%@ Register assembly="DevExpress.Web.v12.2, Version=12.2.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" namespace="DevExpress.Web.ASPxEditors" tagprefix="dx" %>
<!doctype html />
<html>
<head>
<script type="text/javascript">
function checkAllCheckBox_OnCheckedChanged(sender, e) {
var checked = sender.GetChecked();
// Loop to set all checkboxes to column header checkbox state...?
}
</script>
</head>
<body>
<dx:ASPxGridView ID="SomeInformationGridView" runat="server" KeyFieldName="ID" ClientInstanceName="grid" AutoGenerateColumns="False" SettingsPager-Mode="ShowPager" SettingsPager-PageSize="50" style="width: 95%;">
<SettingsBehavior AllowGroup="false" AllowDragDrop="false" />
<Columns>
<dx:GridViewCommandColumn ShowSelectCheckbox="true" VisibleIndex="0" Width="32px" CellStyle-HorizontalAlign="Center">
<HeaderTemplate>
<dx:ASPxCheckBox ID="CheckAllCheckBox" runat="server" AutoPostBack="false" clientinstancename="checkAllCheckBox" OnInit="CheckAllCheckBox_Init">
<ClientSideEvents CheckedChanged="checkAllCheckBox_OnCheckedChanged" />
</dx:ASPxCheckBox>
</HeaderTemplate>
<HeaderStyle HorizontalAlign="Center" />
</dx:GridViewCommandColumn>
<dx:GridViewDataTextColumn FieldName="ID" VisibleIndex="1" Visible="false" ReadOnly="true" CellStyle-HorizontalAlign="Center">
<HeaderStyle HorizontalAlign="Center" />
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="SomeOtherData" VisibleIndex="2" Visible="true" ReadOnly="true" CellStyle-HorizontalAlign="Center">
<HeaderStyle HorizontalAlign="Center" />
</dx:GridViewDataTextColumn>
<--! Other Columns Here -->
</Columns>
</dx:ASPxGridView>
</body>
</html>
VB Code-Behind
Imports System
Imports System.Web.UI
Imports DevExpress.Web.ASPxEditors
Imports DevExpress.Web.ASPxGridView
Partial Public Class TestPage
Inherits Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Dim gridView As ASPxGridView = CType(Me.FindControl("SomeInformationGridView"), ASPxGridView)
gridView.DataSource = GetMyInformation()
gridView.DataBind()
End Sub
Protected Sub CheckAllCheckBox_Init(sender As Object, e As EventArgs)
Dim checkBox As ASPxCheckBox = sender
Dim grid As ASPxGridView = SomeInformationGridView ' CType(Me.FindControl("SomeInformationGridView"), ASPxGridView)
checkBox.Checked = (grid.Selection.Count = grid.VisibleRowCount)
End Sub
Private Function GetMyInformation()
' Reads the data to be bound to the grid.
End Function
End Class
尝试在 gridheader 模板中添加以下 js 和 html 调用:
//javascript function
function CheckAll(chkBx, gvID)
{
var gv = document.getElementById(gvID);
for (i = 1; i < gv.rows.length; i++) {
if (gv.rows[i].style.display != 'none') {
gv.rows[i].cells[0].getElementsByTagName("INPUT")[0].checked = chkBx.checked;
}
};
};
//add this to your grid header template
<HeaderTemplate>
<asp:CheckBox ID="chkAllAvail" ToolTip="Select all" runat="server" onclick="CheckAll(this, 'SomeInformationGridView');" Visible="true" />
</HeaderTemplate>
I am constrained to using their currently-licensed version of the DevExpress controls which is 12.2.5
是的,如果您使用的是这样的旧版本,则有必要使用一堆代码来模拟此功能。
查看 OBSOLETE - ASPxGridView - How to implement SelectRows and SelectAllRowsOnPage CheckBox features 说明以了解如何完成此操作。