RadGrid NeedDataSource事件传参触发CS0123错误求解
错误原因
CS0123报错的核心是委托签名不匹配:GridNeedDataSourceEventHandler 委托要求绑定的方法必须只接收两个参数:object sender 和 GridNeedDataSourceEventArgs e。你定义的RadGrid2_NeedDataSource方法额外加了第三个DataTable t参数,同时你既在ASPX前端标签里通过OnNeedDataSource="RadGrid2_NeedDataSource"绑定了这个不符合签名的方法,又在后端尝试用lambda包装传参,直接触发编译错误。
修复方案
选其中一种方案即可,不要混用。
方案1:使用标准事件签名(推荐)
这是最符合Telerik控件使用规范的写法:
- 删掉后端手动绑定事件的代码:
Radgrid2.NeedDataSource += new GridNeedDataSourceEventHandler(...)这整行直接删除,前端ASPX里的OnNeedDataSource="RadGrid2_NeedDataSource"绑定保留。 - 修改后端事件方法,去掉第三个参数,把DataTable存为页面级变量(注意处理回发时的数据持久化):
// 页面级变量存储数据源,按需选择持久化方式:ViewState/Session/每次重新查询 private DataTable GridDataSource { get { // 示例:存在ViewState里,数据量大时不推荐,建议每次事件触发重新查库 if (ViewState["GridData"] == null) { ViewState["GridData"] = GetYourDataTableFromSource(); // 替换成你获取DataTable的逻辑 } return (DataTable)ViewState["GridData"]; } } protected void RadGrid2_NeedDataSource(object sender, GridNeedDataSourceEventArgs e) { RadGrid2.DataSource = GridDataSource; }
方案2:移除前端绑定,用lambda闭包传参
如果你确实要用lambda传自定义参数:
- 删掉ASPX里RadGrid标签上的
OnNeedDataSource="RadGrid2_NeedDataSource"属性,避免重复绑定和签名不匹配问题。 - 后端代码调整为(注意不要写在
!IsPostBack判断里,否则回发时事件会丢失):
protected void Page_Init(object sender, EventArgs e) { // 事件绑定放在Page_Init里保证回发时不失效 DataTable dt = GetYourDataTableFromSource(); // 替换成你的DataTable获取逻辑 RadGrid2.NeedDataSource += (s, args) => { RadGrid2.DataSource = dt; }; }
注意事项
- 禁止同时在前端属性和后端代码里重复绑定NeedDataSource事件,会导致事件触发两次,出现重复绑定数据的问题。
- RadGrid的NeedDataSource事件会在分页、排序、筛选等所有需要数据的场景自动触发,不需要手动调用
RadGrid2.DataBind()方法,手动调用反而会破坏控件内置的分页排序逻辑。 - 如果DataTable数据量较大,不要存在ViewState/Session里,建议在NeedDataSource事件触发时,根据控件当前的分页页码、排序字段实时查询数据库,减少页面状态体积,提升加载速度。
内容的提问来源于stack exchange,提问作者Vivek Shukla
相关产品推荐
相关产品推荐

