2012-06-05 4 views
9

У меня есть datagridview со следующими данными.Ячейка гиперссылок в Winforms DataGridView

ContactType  |  Contact 
------------------------------------ 
Phone    |  894356458 
Email    |  [email protected] 

Здесь, мне нужно, чтобы отобразить данные «[email protected]» в качестве гиперссылки, с подсказкой «Нажмите, чтобы отправить по электронной почте». Числовые данные «894356458» не должны иметь гиперссылку.

Любые идеи ???

TIA!

+0

Я отредактировал мой ответ, объясняя, как использовать мой первый вариант в вашем случае лучше (скрывая одну колонку и используя DataPropertyName), а также предлагает второй вариант на ответ, где вы храните текст колонки. –

ответ

18

DataGridView имеет тип столбца для этого, DataGridViewLinkColumn.

Вы должны привязкой этого столбца типа вручную, где DataPropertyName задает столбец, чтобы связать в источнике данных сетки в:

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

Вы также хотите, чтобы скрыть автогенерируемый текст столбец, который исходит от Контактной собственности сетки.

Кроме того, как и в случае с 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; 
     } 
    } 
} 
+0

В стороне - одна хорошая вещь с datagridview заключается в том, что при ответе на содержимое ячейки вы можете сделать что-то вроде открытия службы Voip при щелчке по номеру телефона. –

+0

В качестве альтернативы, не могли бы вы сделать обратное? Определите свою сетку по умолчанию (TextBoxCell), как обычно, а затем гиперссылку ячейки (я), которую вы хотите в каждой строке? Просто интересно, почему вы по умолчанию отказались от LinkCells, а затем явным образом изменили обратно на TextBox. –

+1

@Brett столбец гиперссылки содержит некоторые дополнительные свойства и поведение, которые удобны, например, цвет посещенных ссылок и TrackVisitedState - уверен, что вы могли бы сделать это наоборот, но я думаю, что это путь более удобен. –

Смежные вопросы