发现过程:我要利用ViewState来传递两次回发之间的状态,发现不起作用。后来我在DataGrid的SortCommand事件过程中添加了一个计数器,并显示在一个Label控件中,结果发现该事件过程被执行两次。
我目前的解决办法是:当计数大于一时,强制事件过程立即返回。
但问题是:为什么这个事件过程被执行两次?
请教高手解答
17 个解决方案
#1
up
#2
page_load()
if not page.ispostback then
BindGrid()
End If
if not page.ispostback then
BindGrid()
End If
#3
jaffler()
我的page——load()中已经作了这个。也就是说,仅仅在非PostBack时才执行load事件的BindData()。
谢谢你的答复,但这不是我的问题。
我的page——load()中已经作了这个。也就是说,仅仅在非PostBack时才执行load事件的BindData()。
谢谢你的答复,但这不是我的问题。
#4
看看你的ItemCommand里面的代码,或者贴出来看看
#5
答:我以前遇到过的,不大记得了
好象是要在if(!postback){}里加一个if判断sorts,
在sort_command里datagrid要再获得datasource,databind
你先试一下
我回去再看看
好象是要在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事件被引发两次。
再次感谢!!!
目前还是用计数器判断。
我的代码很简单:
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!
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();
}
{
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"] = "";
}
}
{
++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
if not page.ispostback then
BindGrid()
End If
#3
jaffler()
我的page——load()中已经作了这个。也就是说,仅仅在非PostBack时才执行load事件的BindData()。
谢谢你的答复,但这不是我的问题。
我的page——load()中已经作了这个。也就是说,仅仅在非PostBack时才执行load事件的BindData()。
谢谢你的答复,但这不是我的问题。
#4
看看你的ItemCommand里面的代码,或者贴出来看看
#5
答:我以前遇到过的,不大记得了
好象是要在if(!postback){}里加一个if判断sorts,
在sort_command里datagrid要再获得datasource,databind
你先试一下
我回去再看看
好象是要在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事件被引发两次。
再次感谢!!!
目前还是用计数器判断。
我的代码很简单:
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!
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();
}
{
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"] = "";
}
}
{
++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