Telerik RadGridView过滤报错:表达式含无效名称'[]'求助
Telerik RadGridView过滤功能报错排查
问题描述
实现Telerik RadGridView过滤功能时,选择过滤条件后触发报错,但数据可正常加载显示。
错误信息
Telerik.Data.Expressions.LexicalException: 表达式包含无效名称: '[]'。 在 Telerik.Data.Expressions.ExpressionParser.TryParse(Boolean enableExceptions, ExpressionNode& expressionNode) 在 Telerik.Data.Expressions.ExpressionParser.Parse(String expression, Boolean caseSensitiveLike) 在 Telerik.WinControls.Data.RadCollectionView`1.set_FilterExpression(String value) 在 Telerik.WinControls.UI.GridViewFilterDescriptorCollection.ApplyFilter() 在 Telerik.WinControls.UI.GridViewFilterDescriptorCollection.OnCollectionChanged(NotifyCollectionChangedEventArgs args) 在 Telerik.Collections.Generic.NotifyCollection`1.InsertItem(Int32 index, T item) 在 Telerik.WinControls.UI.GridViewFilterDescriptorCollection.InsertItem(Int32 index, FilterDescriptor item) 在 System.Collections.ObjectModel.Collection`1.Add(T item) 在 Telerik.WinControls.UI.GridViewDataColumn.SetFilterDescriptor(FilterDescriptor value) 在 Telerik.WinControls.UI.GridHeaderCellElement.filterPopup_FilterConfirmed(Object sender, EventArgs e) 在 Telerik.WinControls.UI.BaseFilterPopup.OnFilterConfirmed() 在 Telerik.WinControls.UI.RadListFilterPopup.OnButtonOkClick(EventArgs e) 在 Telerik.WinControls.UI.RadListFilterPopup.ButtonOK_Click(Object sender, EventArgs e) 在 Telerik.WinControls.RadElement.OnClick(EventArgs e) 在 Telerik.WinControls.UI.RadButtonItem.OnClick(EventArgs e) 在 Telerik.WinControls.UI.RadButtonElement.OnClick(EventArgs e) 在 Telerik.WinControls.RadElement.DoClick(EventArgs e) 在 Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) 在 Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) 在 Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args) 在 Telerik.WinControls.RadElement.DoMouseUp(MouseEventArgs e) 在 Telerik.WinControls.ComponentInputBehavior.OnMouseUp(MouseEventArgs e) 在 Telerik.WinControls.RadControl.OnMouseUp(MouseEventArgs e) 在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 在 System.Windows.Forms.Control.WndProc(Message& m) 在 System.Windows.Forms.ScrollableControl.WndProc(Message& m) 在 Telerik.WinControls.RadControl.WndProc(Message& m) 在 Telerik.WinControls.UI.RadPopupControlBase.WndProc(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
相关代码
数据加载代码
private void usrAjuda_Load(object sender, EventArgs e){ JArray JRecords = new JArray(); retStatEx ret = Functions.getSQLreader(strSelect,"",ref JRecords); ApiResultObj ent = Newtonsoft.Json.JsonConvert.DeserializeObject<ApiResultObj>(ret.retString); if (ent.ErrorCode == 0){ grdDados.DataSource = JRecords; grdDados.Columns[0].Width = 80; } }
窗体设计器代码
// // grdDados // this.grdDados.AutoSizeRows = true; this.grdDados.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.grdDados.Location = new System.Drawing.Point(12, 12); // // // this.grdDados.MasterTemplate.AllowAddNewRow = false; this.grdDados.MasterTemplate.AllowColumnReorder = false; this.grdDados.MasterTemplate.AllowDeleteRow = false; this.grdDados.MasterTemplate.AllowEditRow = false; this.grdDados.MasterTemplate.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill; this.grdDados.MasterTemplate.EnableFiltering = true; this.grdDados.MasterTemplate.ShowFilteringRow = false; this.grdDados.MasterTemplate.ShowHeaderCellButtons = true; this.grdDados.MasterTemplate.ViewDefinition = tableViewDefinition1; this.grdDados.Name = "grdDados"; this.grdDados.ReadOnly = true; this.grdDados.ShowGroupPanel = false; this.grdDados.ShowHeaderCellButtons = true; this.grdDados.Size = new System.Drawing.Size(1062, 404); this.grdDados.TabIndex = 0; this.grdDados.ThemeName = "Crystal"; this.grdDados.CellDoubleClick += new Telerik.WinControls.UI.GridViewCellEventHandler(this.grdDados_CellDoubleClick);
问题原因及解决办法
原因
直接将JArray绑定为RadGridView的数据源时,控件无法正确识别数据的属性结构。JArray中的元素是动态的JToken对象,没有明确的强类型属性,导致过滤表达式解析器生成包含[]的无效表达式,触发LexicalException。
解决办法
两种可行方案任选其一:
方案1:反序列化为强类型集合
- 定义与返回数据结构匹配的实体类:
public class DataModel { // 根据实际返回字段定义属性,例如: public int Id { get; set; } public string Nome { get; set; } // 其他字段... }
- 修改数据加载代码,将
JArray转换为强类型列表后绑定:
private void usrAjuda_Load(object sender, EventArgs e){ JArray JRecords = new JArray(); retStatEx ret = Functions.getSQLreader(strSelect,"",ref JRecords); ApiResultObj ent = Newtonsoft.Json.JsonConvert.DeserializeObject<ApiResultObj>(ret.retString); if (ent.ErrorCode == 0){ // 转换为强类型列表 var dataList = JRecords.ToObject<List<DataModel>>(); grdDados.DataSource = dataList; grdDados.Columns[0].Width = 80; } }
方案2:转换为DataTable绑定
如果无法定义强类型,可将JArray转换为DataTable,RadGridView对DataTable的过滤支持更完善:
private void usrAjuda_Load(object sender, EventArgs e){ JArray JRecords = new JArray(); retStatEx ret = Functions.getSQLreader(strSelect,"",ref JRecords); ApiResultObj ent = Newtonsoft.Json.JsonConvert.DeserializeObject<ApiResultObj>(ret.retString); if (ent.ErrorCode == 0){ // 转换为DataTable DataTable dt = JsonConvert.DeserializeObject<DataTable>(JRecords.ToString()); grdDados.DataSource = dt; grdDados.Columns[0].Width = 80; } }
内容的提问来源于stack exchange,提问作者Sergio Sarabando
相关产品推荐
相关产品推荐

