无法使用 UseColumnTexForLink 打开链接:True

问题描述 投票:0回答:1

我检索外部数据,包括个人资料页面的链接

在DataGridView的“Url”栏中,我是这样配置的:

列类型:DataGridViewLinkColumn

UseColumnTexForLink:True

文字:查看简介

当我运行程序时,我收到带有链接和文本“查看配置文件”的数据,但是当我单击它时,会抛出异常:“System.ComponentModel.Win32Exception:'找不到指定的文件'” .

另一方面,当 UseColumnTexForLink= False 且 Text=empty 时,链接可以正确打开。

您有什么建议或想法吗?

谢谢

foreach (UserRank user in userRanks)
 {
    // Adding data to the DataGridView
    dataGridViewTopRanking.Rows.Add(user.NickName, user.Rank, user.FollowerCount, user.PositionShared, user.LeaderboardUrl);
 }


private void dataGridViewTopRanking_CellContentClick(object sender, DataGridViewCellEventArgs e)
 {
     string url = dataGridViewTopRanking.Rows[e.RowIndex].Cells["Link"].Value.ToString();
     System.Diagnostics.Process.Start(url);
 }
c# datagridview
1个回答
0
投票

DataGridViewLinkColumn
中,使用
UseColumnTextForLinkValue
属性显示
Text
属性的值而不是链接在数据绑定场景中非常有用,您可以在其中获取实际值(链接)从数据源通过当前行的
DataBoundItem
属性。

当您手动填充网格时,这不起作用,因为将所属列的属性设置为

true
也会将每个单元格的
DataGridViewLinkCell.UseColumnTextForLinkValue
设置为
true
。这意味着,
DataGridViewLinkCell.Value
属性将始终返回所属列的
Text
属性的值。在这种情况下,除非将其存储在某个位置(例如
Tag
属性),否则无法获取实际值。因此,您会收到异常,因为您将
See profile
作为
Process.Start(...)
参数传递给
fileName
方法。

作为存储实际值的替代方法,请实现

DataGridView.CellFormatting

private void dataGridViewTopRanking_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    int linkCol = 1; // the index of your link column...
            
    if (e.RowIndex >= 0 && e.ColumnIndex == linkCol && e.Value != null)
    {
        e.Value = "See profile";
        e.FormattingApplied = true;
    }
}

...以及

CellContentClick
事件:

private void dataGridViewTopRanking_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    int linkCol = 1;
    var dgv = sender as DataGridView;

    if (e.RowIndex >= 0 && e.ColumnIndex == linkCol)
    {
        var url = dgv[linkCol, e.RowIndex].Value?.ToString();

        if (!string.IsNullOrEmpty(url))
        {
            Process.Start(new ProcessStartInfo
            {
                FileName = url,
                UseShellExecute = true
            });
        }
    }
}

确保

url
是有效的路径/UNC/Uri,并且不要忘记将
UseColumnTextForLinkValue
属性重置为其默认值。您可能还希望在
Process.Start
块内进行
try...catch
调用,以防出现问题。

© www.soinside.com 2019 - 2024. All rights reserved.