2012-06-05 4 views
9

Ho una vista datagrid con i seguenti dati.Cella di collegamento ipertestuale in Winforms DataGridView

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

Qui, ho bisogno di visualizzare i dati "[email protected]" come un collegamento ipertestuale, con un tooltip "Clicca per inviare e-mail". I dati numerici "894356458" non dovrebbero avere un collegamento ipertestuale.

Qualche idea ???

TIA!

+0

Ho modificato la mia risposta, che spiega come utilizzare la mia prima opzione nel caso migliore (nascondendo una colonna e l'utilizzo di DataPropertyName), oltre ad offrire una seconda variante sulla risposta in cui si mantiene la colonna di testo. –

risposta

18

Il DataGridView ha un tipo di colonna per questo, DataGridViewLinkColumn.

È necessario DataBind digitare manualmente questa colonna, dove DataPropertyName imposta la colonna di legarsi al DataSource della griglia:

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

Si vuole anche per nascondere la colonna di testo generato automaticamente che deriva dalla proprietà di contatto di la griglia.

Inoltre, come con lo DataGridViewButtonColumn è necessario gestire autonomamente l'interazione dell'utente rispondendo all'evento CellContentClick.


Per quindi modificare i valori delle celle che non sono collegamenti ipertestuali a testo normale è necessario sostituire il tipo di cellula legame con la cellula casella di testo. Nell'esempio che segue ho fatto questo durante la manifestazione 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(); 
     } 
    } 
} 

È inoltre possibile eseguire questa operazione dalla direzione opposta, la modifica del DataGridViewTextBoxCell ad un DataGridViewLinkCell suggerisco questo secondo dato che sarà necessario applicare eventuali modifiche applicabili a tutti i collegamenti a ogni cella.

Questo ha il vantaggio però che non sarà quindi necessario nascondere la colonna generata automaticamente, quindi potrebbe adattarsi meglio.

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

Per inciso, una cosa carina con il datagridview è che quando si risponde al contenuto della cella, si può fare qualcosa come aprire un servizio Voip quando si fa clic su un numero di telefono. –

+0

In alternativa, non potresti fare il contrario? Definisci la tua griglia per impostazione predefinita (TextBoxCell) come faresti normalmente, quindi i collegamenti ipertestuali tra le celle che vuoi in ogni riga? Chiedendo semplicemente il motivo per cui è stato eseguito il collegamento a LinkCells, è stato modificato in TextBox –

+1

@Brett la colonna del collegamento ipertestuale presenta alcune proprietà e comportamenti aggiuntivi, come ad esempio il colore del link visitato e TrackVisitedState: sicuramente si potrebbe fare il contrario, ma penso che questo il modo è più conveniente. –