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

如何禁用UltraGrid URL列默认的未定义协议报错行为?

解决UltraGrid URL列含特殊格式时触发的未定义协议报错问题

我之前也碰到过UltraGrid这个头疼的问题——当URL列内容带冒号(比如ABC:DE)时,控件会误把冒号前的内容当作自定义协议,触发系统的“未定义协议”错误弹窗。其实有两种简单的方式可以禁用这个默认行为,完美解决问题:

方法一:完全接管URL列的样式与点击逻辑

如果你不想依赖UltraGrid内置的URL样式解析,完全可以自己模拟链接外观,然后通过自定义事件处理点击,彻底绕过控件的默认逻辑:

  1. 初始化列样式:不要设置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;
  1. 自定义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打开操作,替换成自己的逻辑:

  1. 注册BeforeUrlOpen事件:
ultraGrid1.BeforeUrlOpen += UltraGrid1_BeforeUrlOpen;
  1. 实现事件处理逻辑:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:32:44