C# ASPxGridView允许使用ASPxCheckBox进行排序和数据项模板

C# ASPxGridView允许使用ASPxCheckBox进行排序和数据项模板,c#,asp.net,devexpress,aspxgridview,C#,Asp.net,Devexpress,Aspxgridview,我有一个ASPxGridView,其中包含一个列,其中包含一个DataItemTemplate,其中包含一个ASPxCheckBox。然后,我在网格外有一个按钮,它根据复选框是否被选中来执行一些操作 网格定义为: 网格填充在Page\u Load中,如下所示: protected void Page_Load(object sender, EventArgs e) { //Some stuff grid.DataSource = sourceTable; grid.D

我有一个
ASPxGridView
,其中包含一个列,其中包含一个
DataItemTemplate
,其中包含一个
ASPxCheckBox
。然后,我在网格外有一个按钮,它根据复选框是否被选中来执行一些操作

网格定义为:


网格填充在
Page\u Load
中,如下所示:

protected void Page_Load(object sender, EventArgs e)
{
    //Some stuff
    grid.DataSource = sourceTable;
    grid.DataBind();
    //Other stuff
}
其中
sourceTable
定义为:

public DataTable sourceTable
{
    get
    {
        if (ViewState["sourceTable"] == null)
            return new DataTable();
        return (DataTable)ViewState["sourceTable"];
    }
    set
    {
        ViewState["sourceTable"] = value;
    }
}
并在其他地方居住。(人口不重要,也不工作)

代码的实现是为了确保排序和分页在网格上正常工作,如各种DevExpress支持主题中所定义。这是可以理解的。但是,当我们试图从按钮单击上的
复选框中获取
选中的值时,它始终为false:

protected void button_Click(object sender, EventArgs e)
{
    //Some stuff
    for(int i = 0; i < grid.VisibleRowCount; i++)
    {
        //Other stuff
        ASPxCheckBox checkbox = grid.FindRowCellTemplateControl(i, grid.Columns[0], "checkbox") as ASPxCheckBox;
        if(checkbox.Checked) //Always false
        {
            //Do conditional stuff
        }
        //More stuff
    }
    //Even more stuff
}
受保护的无效按钮\u单击(对象发送者,事件参数e)
{
//一些东西
对于(int i=0;i
我理解为什么这总是错误的,因为网格重新绑定数据并将复选框重新创建为其默认状态,我为此问题找到的任何关于DevExpress状态的文档都将数据绑定包装在
页面加载中
如果(!Page.IsPostBack)
中,这确实有效,但会中断排序和分页

我确信在我做过的其他项目中我也有解决这个问题的方法,我就是找不到。在这种情况下应该怎么做

注意:我已经将代码缩短到了我可以忽略的最小值,并且没有对其进行测试。实际代码中可能有一些小错误,但请将其用作我尝试执行的操作指南,并澄清人们可能遇到的任何问题


编辑:在
Page\u Load
中使用
if(!Page.IsPostBack)
if(!Page.IsCallback)
停止网格上的排序和分页,删除此条件意味着
选中的
始终为false。我需要进行排序/分页,并且能够读取
DataItemTemplate

ASPxCheckBox
选中值,因为当您单击按钮,然后页面发布到服务器,以及页面发布到服务器时,所有控件都设置为默认值(如果您不控制isPostBack属性)。您可以在客户端执行网格控制排序。但发布到服务器端和呈现到客户端的排序被删除。您可以使用回调函数。
例:


代码隐藏:

if (!IsPostBack)
        {
            //Some stuff

            grid.DataSource = sourceTable;

            grid.DataBind();

            //Other stuff
        }

protected void ASPxGridView1_CustomCallback(object sender, DevExpress.Web.ASPxGridViewCustomCallbackEventArgs e)
    {
        for (int i = 0; i < grid.VisibleRowCount; i++)
        {
            //Other stuff

            ASPxCheckBox checkbox = grid.FindRowCellTemplateControl(i, grid.DataColumns[0], "checkbox") as ASPxCheckBox;

            if (checkbox.Checked) //Always false

            {

                //Do conditional stuff

            }

            //More stuff

        }
    }
if(!IsPostBack)
{
//一些东西
grid.DataSource=sourceTable;
grid.DataBind();
//其他东西
}
受保护的无效ASPxGridView1\u CustomCallback(对象发送者,DevExpress.Web.ASPxGridViewCustomCallbackEventArgs e)
{
对于(int i=0;i
在c#中显示回调和回发之间的差异
编辑的答案

DataItemTemplate
中使用编辑器时,似乎必须使用
LoadPostData()
来获取它们的值

使用:

for(int i=0;i
至于填充网格,您可以将其保留在
页面加载
中,而无需
!IsPostBack
,因为它不会影响编辑器(并且会保留筛选/排序)

在其他情况下可能会导致问题,但这里的情况并非如此


希望有帮助!如果您有任何问题,请告诉我

有一些变体

页面初始化事件处理程序

您可以尝试将绑定代码移动到
Page\u Init
事件处理程序

protected void Page_Init(object sender, EventArgs e)
{
    grid.DataSource = sourceTable;
    grid.DataBind();
}
CheckBox
编辑器的
PostData
Page_Init
Page_Load
之间加载,因此调用
grid.DataBind
方法后,将在
Page_Load
事件中删除
CheckBox
列中的值


GridViewCommandColumn和ShowSelectCheckbox=“true”

这是另一种可能性。您可以通过使用带有属性的
GridViewCommandColumn
来模拟所需的行为


您可以使用方法获取选中的行。
下面是一个例子:

protected void Button1_Click(object sender, EventArgs e)
{
    //Some stuff
    for (int i = 0; i < grid.VisibleRowCount; i++)
    {
        //Other stuff                
        if (grid.Selection.IsRowSelected(i))
        {
            //Do conditional stuff
        }
        //More stuff
    }
    //Even more stuff
}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
//一些东西
对于(int i=0;i
很快将对此进行测试,但我觉得这仍然会破坏排序?因为数据源在页面加载时没有绑定?实际上,该按钮在此处无法执行任何操作,因为它不会发回,因此不会运行
按钮\u单击
代码。确定您的编辑更有意义。但仍然感觉排序将被破坏。您可以对复选框列进行排序
protected void Page_Init(object sender, EventArgs e)
{
    grid.DataSource = sourceTable;
    grid.DataBind();
}
protected void Button1_Click(object sender, EventArgs e)
{
    //Some stuff
    for (int i = 0; i < grid.VisibleRowCount; i++)
    {
        //Other stuff                
        if (grid.Selection.IsRowSelected(i))
        {
            //Do conditional stuff
        }
        //More stuff
    }
    //Even more stuff
}