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
}