问题描述:前端绑定aspxgridview数据,后端动态改变查询条件,能抓取数据并显示到前端,但是在使用过滤和统计功能时,数据变为初始状态时的数据。
解决方法:采用设计时前端使用数据源控件取数据创建aspxgridview,主要为设计快速,设计结束时,将前端数据源控件代码屏蔽,然后为aspxgridview创建后台的load事件,为aspxgridview创建全局datatable,在load事件中设置datasource为全局datatable,并绑定之,此事件在每次刷新页面、排序、过滤、统计、查询时都会调用,然后为aspxgridview 创建customcallback事件,并通过该事件的e.Parameters来接收前端传来的参数,该参数可为单个,如果前端需要传递多个参数时,当使用组合字符串传之,且在后台接收后使用split进行分隔为多个参数,此事件在前端改变查询条件进行后台查询时会用到,不能使用ajax,在customcallback事件中处理复杂查询,并将查询结果存入全局datatable中,并在customcallback事件中进行:datasource、databind()设置,此时前端就可以显示查询后的数据了,当使用过滤、统计等功能时,aspxgridview会调用load事件,此时load事件中的全局datatable就会采用查询后的结果,从而完成动态改变数据源的效果。
附前端和后端代码:
后端设置全局变量:用于表格数据源
public static DataTable temp_dt1;
后端页面事件:
protected void Page_Load(object sender, EventArgs e)
{
ASPxGridView1.SettingsFilterControl.ViewMode = FilterControlViewMode.VisualAndText;
ASPxGridView1.SettingsFilterControl.AllowHierarchicalColumns = true;
ASPxGridView1.SettingsFilterControl.ShowAllDataSourceColumns = true;
//下列代码:自动列宽
if (!IsPostBack)
{
temp_dt1 =SqlHelper.ExecuteDataTable("select * from 业务数据 where 1<>1",new SqlParameter[]{});
DevGridView_AutoColumnWidth.auto_col_width(ASPxGridView1, num_columns, date_columns, datetime_columns);
}
}
protected void ASPxGridView1_CustomCallback(object sender, DevExpress.Web.ASPxGridViewCustomCallbackEventArgs e)
{
string parameters_list = e.Parameters;
if (parameters_list != "reset")
{
string[] para_string_array = parameters_list.Split(',');
string khmc_str = para_string_array[0].ToString().Trim();
string nd_str = para_string_array[1].ToString().Trim();
string sl_str = para_string_array[2].ToString().Trim();
string sf_str = para_string_array[3].ToString().Trim();
string cxtj_str = "";
if (!string.IsNullOrEmpty(khmc_str) || !string.IsNullOrEmpty(nd_str) || !string.IsNullOrEmpty(sl_str) || !string.IsNullOrEmpty(sf_str))
{
cxtj_str = " and " + (string.IsNullOrEmpty(khmc_str) ? "" : " 客户简称='" + khmc_str + "'") + (string.IsNullOrEmpty(nd_str) ? "" : " and 年度='" + nd_str + "'") + (string.IsNullOrEmpty(sl_str) ? "" : " and 税率=" + sl_str) + (string.IsNullOrEmpty(sf_str) ? "" : " and 收付='" + sf_str + "'");
}
temp_dt1 = SqlHelper.ExecuteDataTable("select * from 业务数据 where (对帐单='' or 对帐单 is null)" + cxtj_str, new SqlParameter[] { });
ASPxGridView1.DataSource = temp_dt1;
ASPxGridView1.DataBind();
}
else
{
temp_dt1 = SqlHelper.ExecuteDataTable("select * from 业务数据 where 1<>1", new SqlParameter[] { });
ASPxGridView1.DataSource = temp_dt1;
ASPxGridView1.DataBind();
}
}
protected void ASPxGridView1_Load(object sender, EventArgs e)
{
ASPxGridView1.DataSource = temp_dt1;
ASPxGridView1.DataBind();
}
前端js代码:
function khmc_combo_SelectedIndexChanged(s, e) {
var khmc_str = khmc_combo.GetText().trim();
var nd_str = nd_combo.GetText().trim();
var sl_str = sl_combo.GetText().trim();
var sf_str = sf_combo.GetText().trim();
var cxtj_str=khmc_str+","+nd_str+","+sl_str+","+sf_str
ASPxGridView1.PerformCallback(cxtj_str);
}