Ячейка гиперссылки в Winforms DataGridView

У меня есть обзор данных со следующими данными.

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

Здесь мне нужно отобразить данные «xyz@abc.com» в виде гиперссылки с подсказкой «Нажмите, чтобы отправить электронное письмо». Данные номера "894356458" не должны иметь гиперссылки.

Любые идеи??

TIA

Ответы на вопрос(1)

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;
        }
    }
}

ВАШ ОТВЕТ НА ВОПРОС