You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:反序列化为强类型集合

  1. 定义与返回数据结构匹配的实体类:
public class DataModel
{
    // 根据实际返回字段定义属性,例如:
    public int Id { get; set; }
    public string Nome { get; set; }
    // 其他字段...
}
  1. 修改数据加载代码,将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:57:33