ASPX.NET如何按条件手动添加Telerik Grid模板列?
失效原因说明
你原来的写法不生效是因为Telerik RadGrid的列定义属于服务器控件的初始化配置,会在页面解析阶段就生成对应控件对象,你在外层加的<% if %>属于页面运行时渲染阶段的逻辑,执行时机晚于列对象的创建,因此判断不会生效。
可行解决方案
方案1:控制列可见性(最简便,90%场景适用)
不需要在外层加if判断,直接把列的Visible属性绑定你的系统判断逻辑即可,不符合条件时Telerik不会将该列渲染到前端,性能影响可忽略:
<telerik:GridTemplateColumn UniqueName="Image" HeaderStyle-Width="170" Reorderable="false" Visible='<%# Session[Global.SYSTEM_NAME].ToString().Contains("Coco Cola") %>'> <ItemTemplate> <center> <asp:Image ID="Image1" runat="server" Height="145" Width="160" AlternateText="Signature preview not available" src='<%# "Data:BASE64VALUE/png;base64," + Eval("BASE64VALUE") %>'/> </center> </ItemTemplate> </telerik:GridTemplateColumn>
注意属性外层要使用单引号包裹,避免和内部字符串的双引号产生解析冲突。
方案2:后台动态生成列(完全不创建多余列对象)
如果要求不符合条件时完全不生成该列的控件对象,可以在Grid的初始化事件中动态添加列:
- 前台删除该模板列的硬编码
- 后台添加对应逻辑:
protected void RadGrid1_Init(object sender, EventArgs e) { // 先判断当前系统 if (Session[Global.SYSTEM_NAME]?.ToString().Contains("Coco Cola") == true) { GridTemplateColumn imageCol = new GridTemplateColumn(); imageCol.UniqueName = "Image"; imageCol.HeaderStyle.Width = Unit.Pixel(170); imageCol.Reorderable = false; imageCol.ItemTemplate = new ImageColumnTemplate(); // 插入到列集合的指定位置 RadGrid1.Columns.Add(imageCol); } } // 实现模板列的渲染逻辑 public class ImageColumnTemplate : ITemplate { public void InstantiateIn(Control container) { HtmlGenericControl centerWrapper = new HtmlGenericControl("center"); Image signImg = new Image(); signImg.ID = "Image1"; signImg.Height = Unit.Pixel(145); signImg.Width = Unit.Pixel(160); signImg.AlternateText = "Signature preview not available"; // 绑定base64数据 signImg.DataBinding += (s, arg) => { var img = s as Image; var dataItem = (img.NamingContainer as GridDataItem).DataItem; string base64Val = DataBinder.Eval(dataItem, "BASE64VALUE")?.ToString(); img.Attributes["src"] = $"Data:BASE64VALUE/png;base64,{base64Val}"; }; centerWrapper.Controls.Add(signImg); container.Controls.Add(centerWrapper); } }
内容的提问来源于stack exchange,提问作者vinay
相关产品推荐
相关产品推荐

