Winforms DataGridView 中的超链接单元格

本文关键字:超链接 单元格 DataGridView Winforms | 更新日期: 2023-09-27 18:36:15

我有一个包含以下数据的数据网格视图。

ContactType        |        Contact
------------------------------------
Phone              |       894356458
Email              |     xyz@abc.com

在这里,我需要将数据"xyz@abc.com"显示为超链接,并带有工具提示"单击以发送电子邮件"。数字数据"894356458"不应有超链接。

有什么想法吗???

啪!

Winforms DataGridView 中的超链接单元格

DataGridView有一个列类型,即DataGridViewLinkColumn

您需要手动对此列类型进行数据绑定,其中DataPropertyName在网格的数据源中设置要绑定到的列:

DataGridViewLinkColumn col = new DataGridViewLinkColumn();
col.DataPropertyName = "Contact";
col.Name = "Contact";       
dataGridView1.Columns.Add(col);

您还需要隐藏来自网格的 Contact 属性的自动生成的文本列。

此外,与DataGridViewButtonColumn一样,您需要通过响应CellContentClick事件自行处理用户交互。


若要将不是超链接的单元格值更改为纯文本,您需要将链接单元格类型替换为文本框单元格。在下面的示例中,我在DataBindingComplete事件期间完成了此操作:

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    foreach (DataGridViewRow r in dataGridView1.Rows)
    {
        if (!System.Uri.IsWellFormedUriString(r.Cells["Contact"].Value.ToString(), UriKind.Absolute))
        {
            r.Cells["Contact"] = new DataGridViewTextBoxCell();
        }
    }
}

您也可以从另一个方向执行此操作,将DataGridViewTextBoxCell更改为我建议的DataGridViewLinkCell,因为您需要将适用于每个单元格的所有链接的任何更改应用于。

这确实具有优点,但您不需要隐藏自动生成的列,因此可能最适合您。

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    foreach (DataGridViewRow r in dataGridView1.Rows)
    {
        if (System.Uri.IsWellFormedUriString(r.Cells["Contact"].Value.ToString(), UriKind.Absolute))
        {
            r.Cells["Contact"] = new DataGridViewLinkCell();
            // Note that if I want a different link colour for example it must go here
            DataGridViewLinkCell c = r.Cells["Contact"] as DataGridViewLinkCell;
            c.LinkColor = Color.Green;
        }
    }
}

您可以在 DataGridView 中更改整列的样式。这也是制作列链接列的一种方法。

DataGridViewCellStyle cellStyle = new DataGridViewCellStyle();
        cellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        cellStyle.ForeColor = Color.LightBlue;
        cellStyle.SelectionForeColor = Color.Black;
        cellStyle.Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Underline);
        dataGridView.Columns[1].DefaultCellStyle = cellStyle;