2009-10-26 14 views
6

Ho riscontrato un problema piuttosto sgradevole con il controllo DataGridView (Windows.Forms, .NET Framework 3.0) quando c'è uno DataGridViewCell più grande di DataGridView stesso . Quando la cella grande viene scorsa nella visualizzazione, viene visualizzata normalmente, tagliata in basso poiché è più grande della vista. Se si scorre verso il basso, alla fine si "scatta" in alto e rimane lì, fino a raggiungere una certa soglia. Quindi, la riga successiva verrà visualizzata in alto e la riga "grande" scomparirà.C# DataGridView, celle grandi: contenuto mai completamente visibile, scorrimento salta cella

A causa di questo non si è mai in grado di vedere pienamente il contenuto della cella di grandi dimensioni.

Ecco un esempio di codice:

using System; 
using System.Windows; 

namespace LoggerTextBox { 
public class TestForm : Form 
{ 
    public TestForm() 
    { 
     Text = "DataGridView Large Cell Example"; 
     SetBounds(0, 0, 300, 200, BoundsSpecified.Width | BoundsSpecified.Height); 

     DataGridView dataGridView = new DataGridView(); 
     dataGridView.Dock = DockStyle.Fill; 
     dataGridView.ScrollBars = ScrollBars.Both; 
     dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders; 
     Controls.Add(dataGridView); 

     DataGridViewColumn column = new DataGridViewTextBoxColumn(); 
     column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 
     column.CellTemplate.Style.WrapMode = DataGridViewTriState.True; 
     dataGridView.Columns.Add(column); 

     // normal row 
     DataGridViewRow row = new DataGridViewRow(); 
     DataGridViewCell cell = (DataGridViewTextBoxCell)column.CellTemplate.Clone(); 
     cell.Value = "Foo"; 
     row.Cells.Add(cell); 
     dataGridView.Rows.AddRange(row); 

     // multiline row 
     row = new DataGridViewRow(); 
     cell = (DataGridViewTextBoxCell)column.CellTemplate.Clone(); 
     cell.Value = 
      "Lorem ipsum dolor sit amet, consetetur sadipscing elitr," + Environment.NewLine + 
      "sed diam nonumy eirmod tempor invidunt ut labore et doloreLorem," + Environment.NewLine + 
      "ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy," + Environment.NewLine + 
      "eirmod tempor invidunt ut labore et dolore magna aliquyam erat,," + Environment.NewLine + 
      "sed diam voluptua. At vero eos et accusam et justo duo dolores et," + Environment.NewLine + 
      "ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est," + Environment.NewLine + 
      "Lorem ipsum dolor sit amet. magna aliquyam erat, sed diam voluptua.," + Environment.NewLine + 
      "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita," + Environment.NewLine + 
      "kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."; 
     row.Cells.Add(cell); 
     dataGridView.Rows.AddRange(row); 

     // normal row 
     row = new DataGridViewRow(); 
     cell = (DataGridViewTextBoxCell)column.CellTemplate.Clone(); 
     cell.Value = "Bar"; 
     row.Cells.Add(cell); 
     dataGridView.Rows.AddRange(row); 
    } 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new TestForm()); 
    } 
} 
} // namespace 

Qualsiasi idea di come risolvere questo problema?

risposta

1

Tronca il contenuto di qualsiasi cella oltre una determinata dimensione (con le ellissi per indicare il troncamento) e consente di fare clic sulla cella per visualizzare una finestra a comparsa con il contenuto completo visibile in una finestra scorrevole. O avrei rendere i contenuti di queste potenzialmente grandi cellule in un controllo utente personalizzato che si contiene barre di scorrimento se il testo è al di là di una certa lunghezza.

Si sta verificando un problema che deriva dal fatto che DataGridView viene utilizzato in modo non intenzionale, quindi non sono sorpreso che non ci sia un modo semplice e integrato per gestire questo.

Aggiornamento: per la visualizzazione dei registri, il ReportViewer potrebbe essere un controllo più adatto. Ecco alcuni collegamenti ad usarlo:

http://www.codeproject.com/KB/cs/reportdisplay.aspx

http://www.microsoft.com/Downloads/details.aspx?FamilyID=f38f7037-b0d1-47a3-8063-66af555d13d9&displaylang=en

http://www.devx.com/dotnet/Article/30424/

+0

ho bisogno di qualcosa di più sofisticato di uno scopi di registrazione di testo (per visualizzare l'output del registro, per l'esattezza) e pensato che il DataGridView (associato a un elenco di voci di registro) sarebbe una buona idea. Ho aggirato questo problema di scorrimento ora suddividendo i messaggi in diverse righe in anticipo. Non esattamente quello che voglio perché questo introduce altri problemi, ma ... okay. Grazie! – sunside

+0

@ Markus: fai tutto il tuo log in latino? :) – MusiGenesis

+0

@Markus: vi consiglio di chiedere il vostro problema come un altro domanda qui su SO, e vedere quello che la gente suggeriscono. Qualcosa come "qual è il miglior controllo per la visualizzazione (potenzialmente molto lunga) degli elementi di log in una winforms app?" Non riesco davvero a pensare ad una buona risposta, me stesso. Probabilmente finirò per scrivere un controllo personalizzato completo per questo, ma è potenzialmente molto lavoro. – MusiGenesis

Problemi correlati