我的ASPxGridView
包含一个DataItemTemplate
的列,其中包含ASPxCheckBox
。然后,我在网格外部有一个按钮,根据是否选中该复选框执行某些操作。
网格定义为:
<dx:ASPxGridView ID="grid" runat="server">
<Columns>
<dx:GridViewDataColumn>
<DataItemTemplate>
<ds:ASPxCheckBox ID="checkbox" runat="server" />
</DataItemTemplate>
</dx:GridViewDataColumn>
<Columns>
</dx:ASPxGridView>
网格填充在Page_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支持主题中所定义。这是可以理解的。但是,当我们尝试在按钮点击时从Checked
获取checkbox
值时,它始终为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
}
我理解为什么这总是错误的,因为网格重新绑定数据并将复选框重新创建为其默认状态,我找到的有关此问题的任何文档都有关于DevExpress状态来包装数据绑定Page_Load
in {{ 1}}确实有效,但会破坏排序和分页。
我确信我已经在其他项目中找到了解决方案,但我无法找到它。在这种情况下该怎么做?
注意:我已经将代码缩短到尽可能少的代码并且没有测试过。实际代码可能存在一些小错误,但请将其作为我尝试做的指南,并澄清人们可能遇到的任何问题。
编辑:在if(!Page.IsPostBack)
中使用if(!Page.IsPostBack)
或if(!Page.IsCallback)
停止对网格进行排序和分页,删除此条件意味着Page_Load
始终为false。我需要进行排序/分页以及能够读取Checked
中Checked
的{{1}}值。
答案 0 :(得分:2)
编辑回答
在DataItemTemplate
中使用编辑器时,您必须使用LoadPostData()
来获取其值。
使用:
for(int i = 0; i < grid.VisibleRowCount; i++)
{
ASPxCheckBox checkbox = grid.FindRowCellTemplateControl(i, grid.Columns[0], "checkbox") as ASPxCheckBox;
((IPostBackDataHandler)checkbox).LoadPostData(checkbox.UniqueID, Request.Form);
if(checkbox.Checked)
{
//Do conditional stuff
}
}
至于填充网格,您可以将其保留在Page_Load
内!IsPostBack
,因为它不会影响编辑器(并且会保留过滤/排序)
在其他情况下会导致问题,但这不是这种情况。
希望它有所帮助!如果您有任何问题,请告诉我
答案 1 :(得分:0)
因为当您按下按钮然后页面发布到服务器并且页面发布到服务器时所有控件都设置为默认值(如果您不控制isPostBack属性)。你在客户端进行网格控制排序。但是发布到服务器端并呈现给客户端,您排序已删除。您可以使用回调。 例如:
<dx:ASPxGridView ID="grid" runat="server" ClientInstanceName="grid" OnCustomCallback="ASPxGridView1_CustomCallback">
<Columns>
<dx:GridViewDataColumn>
<DataItemTemplate>
<dx:ASPxCheckBox ID="checkbox" runat="server" />
</DataItemTemplate>
</dx:GridViewDataColumn>
</Columns>
</dx:ASPxGridView>
<dx:ASPxButton ID="btnSend" runat="server" AutoPostBack="False" Text="Send" Width="100px" ClientInstanceName="btnSend">
<ClientSideEvents Click="function(s, e) { grid.PerformCallback(); }" />
</dx:ASPxButton>
代码背后:
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
}
}
在c#中显示回调和回发之间的区别 Difference between a Postback and a Callback
答案 2 :(得分:0)
有一些变种。
Page_Init事件处理程序
您可以尝试将绑定代码移动到Page_Init
事件处理程序。
protected void Page_Init(object sender, EventArgs e)
{
grid.DataSource = sourceTable;
grid.DataBind();
}
PostData
编辑器的CheckBox
加载在Page_Init
和Page_Load
之间,因此CheckBox
列中的值将在{{1}中删除调用Page_Load
方法后的事件。
GridViewCommandColumn with ShowSelectCheckbox =&#34; true&#34;
这是另一种可能性。您可以使用grid.DataBind
fst
属性来模仿所需的行为。
GridViewCommandColumn
您可以使用ShowSelectCheckbox
方法获取已选中的行
这是一个例子:
<dx:GridViewCommandColumn ShowSelectCheckbox="true" />