2012-06-05 14 views
9

Mam datagridview z następującymi danymi.Komórka hiperłącza w WinForm DataGridView

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

Tutaj muszę wyświetlić dane „[email protected]” jako hiperłącze, z podpowiedzi „Kliknij aby wysłać e-mail”. Dane liczbowe "894356458" nie powinny mieć hiperłącza.

Jakieś pomysły ???

TIA!

+0

Mam edytowane moją odpowiedź, wyjaśniając, w jaki sposób korzystać z pierwszej opcji w twoim przypadku lepiej (ukrywając jedną kolumnę i korzystania DataPropertyName), a także oferując drugą odmianę na odpowiedź gdzie trzymasz kolumny tekstu. –

Odpowiedz

18

Typ DataGridView ma typ kolumny: DataGridViewLinkColumn.

Trzeba databind tej kolumnie wpisać ręcznie, gdzie DataPropertyName ustawia kolumnę do wiązania się w źródle danych w siatce za:

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

Będziesz także chcą, aby ukryć kolumnę wygenerowaną automatycznie tekst, który pochodzi od nieruchomości Kontaktowego siatka.

Ponadto, podobnie jak w przypadku DataGridViewButtonColumn, użytkownik musi samodzielnie obsługiwać interakcję, odpowiadając na zdarzenie CellContentClick.


Aby następnie zmienić wartości komórek, które nie są hiperlinkami do zwykłego tekstu, należy zastąpić typ komórki łącza komórką pola tekstowego. W przykładzie poniżej Robiłem to w trakcie imprezy 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(); 
     } 
    } 
} 

Można to zrobić także z innego kierunku, zmieniając DataGridViewTextBoxCell Do DataGridViewLinkCell Proponuję ten drugi ponieważ trzeba będzie zastosować wszelkie zmiany dotyczące wszystkich łączy do każdej komórki.

Ma to tę zaletę, że nie będzie trzeba ukrywać automatycznie generowanej kolumny, więc może być dla Ciebie najlepsza.

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

Na marginesie - jedna dobra rzecz z datagridview polega na tym, że reagując na zawartość komórki, można kliknąć, aby otworzyć usługę VoIP po kliknięciu numeru telefonu. –

+0

Alternatywnie, czy nie mógłbyś zrobić czegoś odwrotnego? Zdefiniuj domyślnie swoją siatkę (TextBoxCell) tak, jak zwykle, a następnie hiperlinkuj komórki, które chcesz w każdym rzędzie? Zastanawiam się, dlaczego domyślnie LinkCells został jawnie zmieniony z powrotem na TextBox –

+1

@ Brett kolumna hiperłącza ma kilka dodatkowych właściwości i zachowań, które są przydatne, takie jak kolor odwiedzonego łącza i TrackVisitedState - na pewno można to zrobić na odwrót, ale myślę, że to sposób jest wygodniejszy. –

Powiązane problemy