请教高手:DataGrid的SortCommand事件为何引发两次?

时间:2022-01-26 18:50:34
我在测试DataGrid的SortCommand过程中发现,OnSortCommand事件被引发两次。哪位高手遇到过这种情况?

发现过程:我要利用ViewState来传递两次回发之间的状态,发现不起作用。后来我在DataGrid的SortCommand事件过程中添加了一个计数器,并显示在一个Label控件中,结果发现该事件过程被执行两次。

我目前的解决办法是:当计数大于一时,强制事件过程立即返回。
但问题是:为什么这个事件过程被执行两次?

请教高手解答

17 个解决方案

#1


up

#2


page_load()
if not page.ispostback then
  BindGrid()
End If

#3


jaffler() 
我的page——load()中已经作了这个。也就是说,仅仅在非PostBack时才执行load事件的BindData()。

谢谢你的答复,但这不是我的问题。

#4


看看你的ItemCommand里面的代码,或者贴出来看看

#5


答:我以前遇到过的,不大记得了
好象是要在if(!postback){}里加一个if判断sorts,
在sort_command里datagrid要再获得datasource,databind
你先试一下
我回去再看看

#6


我还是没有解决这个问题。:(
目前还是用计数器判断。
我的代码很简单:
protected void MyDataGrid_SortCommand(object source, DataGridSortCommandEventArgs e)
{
++L;
if(L>1) return;
string SortStr = e.SortExpression;

if((string)ViewState["Sort"] != SortStr)
{
BindData(e.SortExpression);
ViewState["Sort"] = e.SortExpression ;
}
else
{
BindData("");
ViewState["Sort"] = "";
}



}

这段代码的目的是:
再次点击某个栏目的Header时,恢复最初的排序(也就是第一次访问该页的顺序)。因此我用了ViewState记录上次点击的栏目是哪个,如果相同就恢复。。。

但是,由于SortCommand被引发两次,导致ViewState保存的状态错误。

现在还是不知道什么原因导致SortCommand事件被引发两次。

再次感谢!!!

#7


不是这里面的问题,你在page_load处设个断点,跟踪一下,看看先执行什么,后执行什么?

#8


我跟踪的结果是:在SortCommand执行到最末一行(})后,立即再次进入SortCommand第一句开始执行!!!

Crazy!

#9


up

#10


还不知道其他事件是否也如此引发多次。那样的话,就麻烦了。
用计数器的方法总是不专业啊

#11


没人知道怎么回事吗?

#12


把binddata和page_load的代码贴出来看看好吗?

#13


protected void Page_Load(Object Src, EventArgs E) 
{
if(!IsPostBack)
{
ViewState.Add("Sort","");
BindData("");
}
}

private void BindData(string SortString)
{
DataSet dstEmployees,dstBranches;
DataTable dtblEmployees;
SqlConnection myConnection;
SqlDataAdapter dadEmployees,dadBranches;
DataColumn dcolEmployeeID;

dstEmployees = new DataSet();
dstBranches = new DataSet();
dtblEmployees = new DataTable("Employees");
dcolEmployeeID = new DataColumn("EmployeeID",typeof(Int16));
dcolEmployeeID.AutoIncrement = true;
dcolEmployeeID.AutoIncrementSeed=1;
dcolEmployeeID.AutoIncrementStep=1;
dtblEmployees.Columns.Add(dcolEmployeeID);
dstEmployees.Tables.Add(dtblEmployees);
string SqlStatement;

myConnection = new SqlConnection( System.Configuration.ConfigurationSettings.AppSettings.Get("sqlConStr"));
SqlStatement = "SELECT a.DisplayOrder, b.ShortName AS BranchName, a.FullName, a.MobilePhone, a.Extention, a.Email, a.OutsideEmail " + 
" FROM Employees a INNER JOIN Branches b ON a.Branch = b.BranchID Order By " + ((SortString=="") ? "a.DisplayOrder":"a."+ SortString);


myConnection.Open();
dadEmployees = new SqlDataAdapter(SqlStatement, myConnection);

dadBranches = new SqlDataAdapter("SELECT " +
" * FROM Branches", myConnection);

dadEmployees.Fill(dstEmployees,"Employees");
dadBranches.Fill(dstBranches);


MyDataGrid.DataSource = dstEmployees; //source ;
MyDataGrid.DataBind();

DataView source1 = new DataView(dstBranches.Tables[0]);
MyDataGrid1.DataSource = source1 ;
MyDataGrid1.DataBind();
myConnection.Close();
}

#14


protected void MyDataGrid_SortCommand(object source, DataGridSortCommandEventArgs e)
{
++L;
if(L>1) return;
string SortStr = e.SortExpression;

if((string)ViewState["Sort"] != SortStr)
{
BindData(e.SortExpression);
ViewState["Sort"] = e.SortExpression ;
}
else
{
BindData("");
ViewState["Sort"] = "";
}
}

#15


采用ViewState保存上次排序的依据,如果相同就按照默认方式(第一次显示该页的方式)排序。由于SortCommand引发两次(刚好相当于在同一个Sort条件上点击两次),从用户角度看,似乎Sort没起作用。我这才发现SortCommand事件被引发两次。

到目前为止我仍然未找到原因。

#16


没遇到过,帮不了你

#17


up

#1


up

#2


page_load()
if not page.ispostback then
  BindGrid()
End If

#3


jaffler() 
我的page——load()中已经作了这个。也就是说,仅仅在非PostBack时才执行load事件的BindData()。

谢谢你的答复,但这不是我的问题。

#4


看看你的ItemCommand里面的代码,或者贴出来看看

#5


答:我以前遇到过的,不大记得了
好象是要在if(!postback){}里加一个if判断sorts,
在sort_command里datagrid要再获得datasource,databind
你先试一下
我回去再看看

#6


我还是没有解决这个问题。:(
目前还是用计数器判断。
我的代码很简单:
protected void MyDataGrid_SortCommand(object source, DataGridSortCommandEventArgs e)
{
++L;
if(L>1) return;
string SortStr = e.SortExpression;

if((string)ViewState["Sort"] != SortStr)
{
BindData(e.SortExpression);
ViewState["Sort"] = e.SortExpression ;
}
else
{
BindData("");
ViewState["Sort"] = "";
}



}

这段代码的目的是:
再次点击某个栏目的Header时,恢复最初的排序(也就是第一次访问该页的顺序)。因此我用了ViewState记录上次点击的栏目是哪个,如果相同就恢复。。。

但是,由于SortCommand被引发两次,导致ViewState保存的状态错误。

现在还是不知道什么原因导致SortCommand事件被引发两次。

再次感谢!!!

#7


不是这里面的问题,你在page_load处设个断点,跟踪一下,看看先执行什么,后执行什么?

#8


我跟踪的结果是:在SortCommand执行到最末一行(})后,立即再次进入SortCommand第一句开始执行!!!

Crazy!

#9


up

#10


还不知道其他事件是否也如此引发多次。那样的话,就麻烦了。
用计数器的方法总是不专业啊

#11


没人知道怎么回事吗?

#12


把binddata和page_load的代码贴出来看看好吗?

#13


protected void Page_Load(Object Src, EventArgs E) 
{
if(!IsPostBack)
{
ViewState.Add("Sort","");
BindData("");
}
}

private void BindData(string SortString)
{
DataSet dstEmployees,dstBranches;
DataTable dtblEmployees;
SqlConnection myConnection;
SqlDataAdapter dadEmployees,dadBranches;
DataColumn dcolEmployeeID;

dstEmployees = new DataSet();
dstBranches = new DataSet();
dtblEmployees = new DataTable("Employees");
dcolEmployeeID = new DataColumn("EmployeeID",typeof(Int16));
dcolEmployeeID.AutoIncrement = true;
dcolEmployeeID.AutoIncrementSeed=1;
dcolEmployeeID.AutoIncrementStep=1;
dtblEmployees.Columns.Add(dcolEmployeeID);
dstEmployees.Tables.Add(dtblEmployees);
string SqlStatement;

myConnection = new SqlConnection( System.Configuration.ConfigurationSettings.AppSettings.Get("sqlConStr"));
SqlStatement = "SELECT a.DisplayOrder, b.ShortName AS BranchName, a.FullName, a.MobilePhone, a.Extention, a.Email, a.OutsideEmail " + 
" FROM Employees a INNER JOIN Branches b ON a.Branch = b.BranchID Order By " + ((SortString=="") ? "a.DisplayOrder":"a."+ SortString);


myConnection.Open();
dadEmployees = new SqlDataAdapter(SqlStatement, myConnection);

dadBranches = new SqlDataAdapter("SELECT " +
" * FROM Branches", myConnection);

dadEmployees.Fill(dstEmployees,"Employees");
dadBranches.Fill(dstBranches);


MyDataGrid.DataSource = dstEmployees; //source ;
MyDataGrid.DataBind();

DataView source1 = new DataView(dstBranches.Tables[0]);
MyDataGrid1.DataSource = source1 ;
MyDataGrid1.DataBind();
myConnection.Close();
}

#14


protected void MyDataGrid_SortCommand(object source, DataGridSortCommandEventArgs e)
{
++L;
if(L>1) return;
string SortStr = e.SortExpression;

if((string)ViewState["Sort"] != SortStr)
{
BindData(e.SortExpression);
ViewState["Sort"] = e.SortExpression ;
}
else
{
BindData("");
ViewState["Sort"] = "";
}
}

#15


采用ViewState保存上次排序的依据,如果相同就按照默认方式(第一次显示该页的方式)排序。由于SortCommand引发两次(刚好相当于在同一个Sort条件上点击两次),从用户角度看,似乎Sort没起作用。我这才发现SortCommand事件被引发两次。

到目前为止我仍然未找到原因。

#16


没遇到过,帮不了你

#17


up