我检索外部数据,包括个人资料页面的链接
在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);
}
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
调用,以防出现问题。