Winforms DataGridView中的超链接单元格

San*_*eep 13 c# datagridview hyperlink

我有一个datagridview与以下数据.

ContactType        |        Contact
------------------------------------
Phone              |       894356458
Email              |     xyz@abc.com
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗???

TIA!

Dav*_*all 23

DataGridView有一个列类型,DataGridViewLinkColumn.

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

DataGridViewLinkColumn col = new DataGridViewLinkColumn();
col.DataPropertyName = "Contact";
col.Name = "Contact";       
dataGridView1.Columns.Add(col);
Run Code Online (Sandbox Code Playgroud)

您还需要隐藏来自网格的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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)