如何禁用UltraGrid URL列默认的未定义协议报错行为?
解决UltraGrid URL列含特殊格式时触发的未定义协议报错问题
我之前也碰到过UltraGrid这个头疼的问题——当URL列内容带冒号(比如ABC:DE)时,控件会误把冒号前的内容当作自定义协议,触发系统的“未定义协议”错误弹窗。其实有两种简单的方式可以禁用这个默认行为,完美解决问题:
方法一:完全接管URL列的样式与点击逻辑
如果你不想依赖UltraGrid内置的URL样式解析,完全可以自己模拟链接外观,然后通过自定义事件处理点击,彻底绕过控件的默认逻辑:
- 初始化列样式:不要设置
ColumnStyle.URL,而是手动设置单元格的蓝色下划线样式:
// 替换成你的URL列名称 var urlColumn = ultraGrid1.DisplayLayout.Bands[0].Columns["TargetURLColumn"]; urlColumn.Style = Infragistics.Win.UltraWinGrid.ColumnStyle.Default; // 设置链接样式:蓝色+下划线 urlColumn.CellAppearance.ForeColor = Color.Blue; urlColumn.CellAppearance.TextDecoration = Infragistics.Win.TextDecorationType.Underline; // 可选:添加 hover 变色效果,更贴近浏览器链接体验 urlColumn.CellAppearance.HoverForeColor = Color.Purple;
- 自定义MouseClick事件处理:在点击时判断是否为URL列,然后执行你的打开逻辑:
private void ultraGrid1_MouseClick(object sender, MouseEventArgs e) { var grid = sender as UltraGrid; if (grid == null) return; var clickedCell = grid.DisplayLayout.ElementFromPoint(e.Location) as UltraGridCell; // 验证是否点击了目标URL列 if (clickedCell != null && clickedCell.Column.Key == "TargetURLColumn") { var urlContent = clickedCell.Text; if (!string.IsNullOrEmpty(urlContent)) { // 可选:自动补全HTTP/HTTPS前缀,避免协议问题 if (!urlContent.StartsWith("http://") && !urlContent.StartsWith("https://")) { urlContent = $"https://{urlContent}"; } // 打开新标签页(使用系统默认浏览器) Process.Start(new ProcessStartInfo(urlContent) { UseShellExecute = true }); } // 阻止控件触发任何默认行为 e.Handled = true; } }
方法二:利用BeforeUrlOpen事件拦截默认行为
如果你想保留UltraGrid内置的URL样式(蓝色下划线、点击后变色),可以直接用控件提供的BeforeUrlOpen事件拦截默认的URL打开操作,替换成自己的逻辑:
- 注册BeforeUrlOpen事件:
ultraGrid1.BeforeUrlOpen += UltraGrid1_BeforeUrlOpen;
- 实现事件处理逻辑:
private void UltraGrid1_BeforeUrlOpen(object sender, BeforeUrlOpenEventArgs e) { // 取消UltraGrid默认的URL打开行为 e.Cancel = true; var urlContent = e.Cell.Text; if (!string.IsNullOrEmpty(urlContent)) { // 同样可以补全HTTP前缀,避免协议错误 if (!urlContent.StartsWith("http://") && !urlContent.StartsWith("https://")) { urlContent = $"https://{urlContent}"; } // 执行自定义打开操作 Process.Start(new ProcessStartInfo(urlContent) { UseShellExecute = true }); } }
问题根源说明
UltraGrid的ColumnStyle.URL会自动识别[协议]:[内容]格式的文本,哪怕你的内容不是合法的HTTP/HTTPS链接(比如ABC:DE),它也会尝试调用系统的协议处理程序,而系统找不到ABC这个协议,就会弹出报错。上面两种方法要么完全接管逻辑,要么拦截默认操作,都能有效规避这个问题。
内容的提问来源于stack exchange,提问作者kzfid
相关产品推荐
相关产品推荐

