在ASP.NET应用程序中,使用了NetAdvantage的UltraWebGrid控件,使用时发现在Cell中按一下回车后不能自动转到下一单元格,必须连按三下回车后,才能转到下一单元格,本文介绍一下出现此现象的原因及处理方法。
经过仔细研究,发现产生这个问题的原因是使用了UltraWebGrid1_UpdateCell服务器端事件,因此当Cell中数据发生变化时,总会Postback到服务器端,等传回后重新刷了页面后,焦点仍然在原单元格上。
解决此问题有两个方法:
(1) (1)在UltraWebGrid1_UpdateCell服务器端事件中增加重新定位到下一单元格的代码
//焦点定位到下一单元格
if (e.Cell.Column.Index < UltraWebGrid1.Columns.Count - 1)
{
UltraWebGrid1.Rows[e.Cell.Row.Index].Cells[e.Cell.Column.Index + 1].Activate();
}
(2) (2)将能在客户端完成的计算在javascript中完成计算,不使用UltraWebGrid1_UpdateCell服务器端事件,如利用客户端的AfterCellUpdateHandler事件触发计算
首先在javascript中定义以下函数:
function AfterCellUpdateHandler(tableName, itemName)
{
var oCol = igtbl_getColumnById(itemName);
if(oCol.Key=="Qty" || oCol.Key=="Price")
{
//计算
}
}
在UltraWebGrid1的ClientSideEvents下的AfterCellUpdateHandler属性中输入 “AfterCellUpdateHandler”,则当Cell值发生变化时,将调用上面的函数,属性设置如下图:

(3)如某些单元格必须使用UpdateCell服务器端事件,此时也可以在ClientSideEvents的AfterCellUpdateHandler事件处理中取消某些不必要的postback,代码如下:
function AfterCellUpdateHandler(tableName, itemName)
{
var oCol = igtbl_getColumnById(itemName);
//如果不是ITEM列,则取消PostBack
if(oCol.Key!="item")
{
igtbl_cancelPostBack(tableName);
}
}
总之,减少postback,对提高WEB应用程序的性能大有裨益。