2009-10-26 6 views
6

Ich habe ein ziemlich unangenehmes Problem mit dem Steuerelement DataGridView (Windows.Forms, .NET Framework 3.0) festgestellt, wenn es eine DataGridViewCell ist, die größer als das DataGridView selbst ist . Wenn die große Zelle in die Ansicht gerollt wird, wird sie normal angezeigt, abgeschnitten an der Unterseite, da sie größer als die Ansicht ist. Wenn Sie weiter nach unten scrollen, "schnappt" es schließlich oben und bleibt dort, bis Sie eine bestimmte Schwelle erreichen. Dann wird die nächste Reihe oben angezeigt und die "große" Reihe verschwindet.C# DataGridView, große Zellen: Inhalt nie vollständig sichtbar, scrollt überspringt Zelle

Aus diesem Grund sind Sie nie in der Lage, den Inhalt der großen Zelle vollständig zu sehen.

Hier ist ein Beispielcode:

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 

Jede Idee, wie dieses Problem beheben?

Antwort

1

Ich würde den Inhalt jeder Zelle über eine bestimmte Größe hinaus abschneiden (mit Ellipsen, um die Kürzung anzuzeigen) und der Zelle erlauben, ein Popup-Fenster mit dem vollen Inhalt anzuzeigen, der in einem scrollbaren Fenster sichtbar ist. Oder ich würde den Inhalt dieser potenziell großen Zellen in einem benutzerdefinierten UserControl rendern, das selbst Bildlaufleisten enthält, wenn der Text eine bestimmte Länge überschreitet.

Sie stoßen auf ein Problem, das daraus resultiert, dass DataGridView in einer nicht beabsichtigten Weise verwendet wird. Daher bin ich nicht überrascht, dass es keinen einfachen, integrierten Weg gibt, um damit umzugehen.

Aktualisieren: Zum Anzeigen von Protokollen könnte die eine geeignetere Steuerung sein. Hier sind einige Links über die Verwendung:

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

Ich brauche etwas anspruchsvoller als eine Textbox Protokollierung (zum Anzeigen der Protokollausgabe, um genau zu sein) und dachte, die DataGridView (an eine Liste von Protokollelementen gebunden) wäre eine gute Idee. Ich habe dieses Scroll-Problem jetzt umgangen, indem ich die Nachrichten zuvor in mehrere Zeilen aufgeteilt habe. Nicht genau was ich will, weil das andere Probleme bringt, aber ... okay. Danke! – sunside

+0

@Markus: Sie tun alle Ihre Anmeldung in Latein? :) – MusiGenesis

+0

@Markus: Ich empfehle, Ihr Problem als eine andere Frage hier auf SO, und sehen, was die Leute vorschlagen. Etwas wie "Was ist die beste Kontrolle für die Anzeige von (möglicherweise sehr langen) Log-Elementen in einer Winforms-App?" Ich kann mir selbst keine gute Antwort vorstellen. Ich würde wahrscheinlich am Ende ein komplettes benutzerdefiniertes Steuerelement dafür schreiben, aber das ist möglicherweise eine Menge Arbeit. – MusiGenesis