解决infragistics的webgrid嵌套子表列名在ajax下(xml paging)出现的乱码问题
webgrid的嵌套子表的功能很强,但我用了xml paging功能时,发现问题:
当子表的列名(Header.Caption)为中文时,展开子表就会出现乱码.而不用xml paging展开子表就没有问题.我郁闷了一上午,最后终于找到了解决的办法(详细过程省略了,反正很痛苦)
原因:当用xml paging方式时,webgrid展开子表的过程,其实就是一次无刷新的操作,而原本设置的列名被post后,出现了乱码,我找到了它的ig_WebGrid_dom脚本:
后来我想,既然是用xmlhttprequest来完成子表的展开,那用客户端的AfterXmlHttpResponseProcessed事件应该可以重新给子表的列赋值了(infragistics自己的控件ClientSideEvents).
添加的客户端事件代码:
列的命名方式: "表格名"+"C_" +"Band的序号" +"_" +"列序号"
如UltraWebGrid1c_1_0 的表格名=UltraWebGrid1,Band的序号=1,列序号=0
这样当展开时,列名就会重新写上去,这样就不会出现乱码了.
注:我用的是2005V3版本,不知道刚刚发布的06V3的版本会不会考虑到这个情况.
当子表的列名(Header.Caption)为中文时,展开子表就会出现乱码.而不用xml paging展开子表就没有问题.我郁闷了一上午,最后终于找到了解决的办法(详细过程省略了,反正很痛苦)
原因:当用xml paging方式时,webgrid展开子表的过程,其实就是一次无刷新的操作,而原本设置的列名被post后,出现了乱码,我找到了它的ig_WebGrid_dom脚本:
this.XmlHttp.open("POST", this.Url, false);
this.XmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
this.XmlHttp.onreadystatechange=new Function("igtbl_onReadyStateChange('"+this.Id+"')");
this.XmlHttp.send("__EVENTTARGET="+this.UniqueID+"&__EVENTARGUMENT=XmlHttpRequest&"+this.UniqueID+"="+igtbl_escape(this.QueryString));
只看出是igtbl_escape()方式,应该和javascript的escape作用差不多,所以直接修改它的脚本好像并不能解决.this.XmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
this.XmlHttp.onreadystatechange=new Function("igtbl_onReadyStateChange('"+this.Id+"')");
this.XmlHttp.send("__EVENTTARGET="+this.UniqueID+"&__EVENTARGUMENT=XmlHttpRequest&"+this.UniqueID+"="+igtbl_escape(this.QueryString));
后来我想,既然是用xmlhttprequest来完成子表的展开,那用客户端的AfterXmlHttpResponseProcessed事件应该可以重新给子表的列赋值了(infragistics自己的控件ClientSideEvents).
添加的客户端事件代码:
function UltraWebGrid1_AfterXmlHttpResponseProcessed(gridName){
var col0 =igtbl_getElementById("UltraWebGrid1c_1_0");
if(col0!=null)
col0.innerText = "接受者";
var col1 = igtbl_getElementById("UltraWebGrid1c_1_1");
if(col1!=null)
col1.innerText = "状态";
var col3 = igtbl_getElementById("UltraWebGrid1c_1_3");
if(col3!=null)
col3.innerText = "回复时间";
var col4 = igtbl_getElementById("UltraWebGrid1c_1_4");
if(col4!=null)
col4.innerText = "回复内容";
}
UltraWebGrid1c_1_0的意思是取子表的第1列的列名,方式如下:var col0 =igtbl_getElementById("UltraWebGrid1c_1_0");
if(col0!=null)
col0.innerText = "接受者";
var col1 = igtbl_getElementById("UltraWebGrid1c_1_1");
if(col1!=null)
col1.innerText = "状态";
var col3 = igtbl_getElementById("UltraWebGrid1c_1_3");
if(col3!=null)
col3.innerText = "回复时间";
var col4 = igtbl_getElementById("UltraWebGrid1c_1_4");
if(col4!=null)
col4.innerText = "回复内容";
}
列的命名方式: "表格名"+"C_" +"Band的序号" +
如UltraWebGrid1c_1_0 的表格名=UltraWebGrid1,Band的序号=1,列序号=0
这样当展开时,列名就会重新写上去,这样就不会出现乱码了.
注:我用的是2005V3版本,不知道刚刚发布的06V3的版本会不会考虑到这个情况.