Discussion:
erzwungener Zeilenumbruch in DataGridView
(zu alt für eine Antwort)
André Pönisch
2006-06-22 12:19:45 UTC
Permalink
Hallo,

ich hätte gern innerhalb von Text-Zellen einer DataGridView erzwungene
Zeilenumbrüche. Ist sowas machbar? Ohne die Zelle gleich ganz selbst zu
zeichnen?

Das WrapMode als Zellen-Stil-Eigenschaft existiert ist mir bewusst, nur
leider wird bei WrapMode=True automatisch umgebrochen, was ich garnicht
gebrauchen kann. Es sollen nur selbst eingefügte Umbrüche umgesetzt werden.

Grüße
André
André Pönisch
2006-06-22 15:36:33 UTC
Permalink
Post by André Pönisch
ich hätte gern innerhalb von Text-Zellen einer DataGridView erzwungene
Zeilenumbrüche. Ist sowas machbar? Ohne die Zelle gleich ganz selbst zu
zeichnen?
Wäre es als Alternative möglich ein anderes Control in eine Zelle
reinzustecken? Z.Bsp. eine Listbox? Eventuell sogar ein weiteres (wenn auch
viel kleineres und einfacheres) DataGridView?

Was ich vergass zu erwähnen: ich nutze .NET 2.0.

Grüße
André
Frank Dzaebel
2006-06-22 21:00:19 UTC
Permalink
Hallo André,
Post by André Pönisch
ich hätte gern innerhalb von Text-Zellen einer DataGridView erzwungene
Zeilenumbrüche. Ist sowas machbar? Ohne die Zelle gleich ganz selbst zu
zeichnen? Was ich vergass zu erwähnen: ich nutze .NET 2.0.
Ja. Mit [Shift-Enter], wenn Du (z.B.) folgenden Code benutzt:

private void Form1_Load(object sender,EventArgs e)
{ dataGridView1.Columns.Add("Spalte1","Spalte1");
dataGridView1.Columns.Add("Spalte2","Spalte2");
dataGridView1.Rows.Add(5);
dataGridView1.Rows[0].Cells[0].Value = "erste Zeile\r\nzweite Zeile";
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
}


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
André Pönisch
2006-06-22 22:38:40 UTC
Permalink
Frank Dzaebel schrieb:
Hallo Frank,
Post by Frank Dzaebel
Hallo André,
Post by André Pönisch
ich hätte gern innerhalb von Text-Zellen einer DataGridView erzwungene
Zeilenumbrüche. Ist sowas machbar? Ohne die Zelle gleich ganz selbst zu
zeichnen? Was ich vergass zu erwähnen: ich nutze .NET 2.0.
dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
Wie ich in meinem ersten Post schon geschrieben hab: WrapMode nützt mir
leider garnichts. Das bricht dann auch automatisch um. AutoSize hin oder
her. Selbst wenn es mit AutoSize funktionieren würde, würde es mir nicht
viel nützen, denn genug Platz kann ich auch nicht immer garantieren und
horizontales Scrollen soll vermieden werden.

Im Grunde hätt ich es schon gern so wie bei der normalen Text-Zelle: soviel
wie möglich anzeigen und ein paar Punkte die auf mehr hinweisen. Momentan
mal ich es jetzt selbst rein, damit fehlen zwar die 3 Punkte, aber sonst
kommt es meiner Vorstellung noch am nächsten. Schön find ich das aber nicht
so wirklich.

Grüße
André
Frank Dzaebel
2006-06-23 06:28:01 UTC
Permalink
Hallo André,
Würde Dir für das Editieren etwas reichen wie:

private void Form1_Load(object sender,EventArgs e)
{
dataGridView1.Columns.Add("Spalte1","Spalte1");
dataGridView1.Columns.Add("Spalte2","Spalte2");
dataGridView1.Rows.Add(5);
dataGridView1.Rows[0].Cells[0].Value = "erste Zeile\r\nzweite Zeile";
dataGridView1.EditingControlShowing += new
DataGridViewEditingControlShowingEventHandler
(dataGridView1_EditingControlShowing);
}
void dataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e)
{ TextBox tb = (TextBox)e.Control;
tb.AcceptsReturn = true; tb.Multiline = true;
}


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
André Pönisch
2006-06-23 07:59:45 UTC
Permalink
Hallo Frank,
Post by Frank Dzaebel
Hallo André,
[Code]
Interessant was man so machen kann. Leider hab ich völlig vergessen zu
erwähnen, das Editieren keine Rolle spielt. Es geht nur ums Anzeigen.

Wäre es denn möglich ein beliebiges Control an der Stelle einer Zelle auch
bei der Anzeige einzubauen? Das würde einiges an Möglichkeiten eröffnen.

Grüße
André
Frank Dzaebel
2006-06-24 06:10:09 UTC
Permalink
Hallo André,
Post by André Pönisch
Interessant was man so machen kann. Leider hab ich völlig vergessen zu
erwähnen, das Editieren keine Rolle spielt. Es geht nur ums Anzeigen.
Wäre es denn möglich ein beliebiges Control an der Stelle einer Zelle auch
bei der Anzeige einzubauen? Das würde einiges an Möglichkeiten eröffnen.
In gewissem Sinne schon.
Ist nur jeweils ein wenig Aufwand. Hier entsprechende
Standard-Verfahren/Links/Ansätze und Downloads:

[CalendarColumn für das DataGridView]
http://Dzaebel.NET/CalendarColumn.htm

[Gewusst wie: Anpassen von Zellen und Spalten im DataGridView-Steuerelement in
Windows Forms durch Erweitern des Aussehens und Verhaltens]
http://msdn2.microsoft.com/de-de/library/7fb61s43.aspx

[Gewusst wie: Anpassen der Darstellung von Zeilen im DataGridView-Steuerelement
in Windows Forms]
http://msdn2.microsoft.com/de-de/library/85kxk29c.aspx

[Gewusst wie: Anpassen der Darstellung von Zellen im DataGridView-Steuerelement
von Windows Forms]
http://msdn2.microsoft.com/de-de/library/hta8z9sz.aspx

[Anpassen des DataGridView-Steuerelements von Windows Forms]
http://msdn2.microsoft.com/de-de/library/ms171618.aspx

Einige nette Ansätze findest Du auch in:

[DataGridView FAQ]
http://www.windowsforms.net/Samples/Go%20To%20Market/DataGridView/DataGridView%20FAQ.doc


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
André Pönisch
2006-06-26 07:55:09 UTC
Permalink
Hallo Frank,
Post by Frank Dzaebel
Post by André Pönisch
Interessant was man so machen kann. Leider hab ich völlig vergessen zu
erwähnen, das Editieren keine Rolle spielt. Es geht nur ums Anzeigen.
Wäre es denn möglich ein beliebiges Control an der Stelle einer Zelle auch
bei der Anzeige einzubauen? Das würde einiges an Möglichkeiten eröffnen.
In gewissem Sinne schon.
Ist nur jeweils ein wenig Aufwand. Hier entsprechende
[Links]
Danke für die Links, da ist sehr interessanter Stoff dabei.

Soweit ich es jetzt verstanden hab, müsste es eigentlich ganz einfach sein
eigene Controls einzubringen, man fügt sie dem DataGridView zu
(dgv.Controls.Add) und positioniert sie über der Zelle. Soweit die Theorie.

Ich hab jetzt über'm WE zwei Varianten probiert:

1. Einfach nur CellPaint-Event gesetzt und ein DataGridView, das als Wert
in der Tabelle steckt, dem übergeordneten DataGridView hinzugefügt und
positioniert. Funktioniert auf den ersten Blick, solange man nicht versucht
zu scrollen. Die inneren DGVs gehen garnicht zu scrollen und sie werden
auch insgesamt nicht immer korrekt dargestellt, wenn man das äußere
scrollt.

2. Eigene Cell- und Column-Klasse für DataTable. Die Zelle erzeugt selbst
ihr DGV und positioniert es bei OnPaint. Sieht auf den ersten Blick
sauberer aus, aber viel testen konnte ich hier noch nicht, denn das Problem
ist hier: ich krieg keine Daten. Ich füge als Beispiel zwar zwei Zeilen
inkl. DataTables hinzu, trotzdem wird nur einmal SetValue in meiner
Zellenklasse ausgeführt. Effektiv haben beide Zeilen dann den DefaultValue
drin. Da komm ich im Moment noch nicht so recht dahinter wo es hängt. Mal
sehen wann ich dazu komm das weiter auszutesten.

Grüße
André

unknown
2006-06-23 09:00:32 UTC
Permalink
Hallo André!
Momentan mal ich es jetzt selbst rein, damit fehlen zwar
die 3 Punkte, aber sonst kommt es meiner Vorstellung noch am
nächsten. Schön find ich das aber nicht so wirklich.
Die 3 Punkte willst aber nur bei single - Line Inhalten?

ggf. kannst Du bei diesen im Paint - Event e.Handled = false setzen. Dann
zeichnet sich die Zelle selbst (und ohne WrapMode bekommst Du ja die drei
Punkte).

Wenn Du es komplett OwnerDraw machen willst, kannst Du über die Methode
e.Graphics.MeasureString die Länge des Strings in Pixeln bestimmen.
Verglichen mit der Spaltenbreite kannst Du dann herausfinden, ob Du die drei
Punkte zeichnen musst.


OK?
mfg GP
André Pönisch
2006-06-23 12:31:57 UTC
Permalink
Hallo Günter,
Post by unknown
Momentan mal ich es jetzt selbst rein, damit fehlen zwar
die 3 Punkte, aber sonst kommt es meiner Vorstellung noch am
nächsten. Schön find ich das aber nicht so wirklich.
Die 3 Punkte willst aber nur bei single - Line Inhalten?
Eigentlich am liebsten bei jeder der Zeilen innerhalb der Zelle. Oder
sonstwie eine Markierung das das noch nicht alles ist. Da fiel mir aber
noch nichts gescheites ein, was ein Benutzer ohne vorherige Erklärung als
solches erkannt hätte. :-)
Post by unknown
Wenn Du es komplett OwnerDraw machen willst, kannst Du über die Methode
e.Graphics.MeasureString die Länge des Strings in Pixeln bestimmen.
Verglichen mit der Spaltenbreite kannst Du dann herausfinden, ob Du die drei
Punkte zeichnen musst.
Daran hab ich gedacht. Schien mir nur für den Moment zu aufwendig da die
Einzel-Zeilen rauszulesen, jede Zeile abzumessen und ggf. Punkte hinten
ranzupappen (die vorher auch gemessen werden müssen ...).

Viel Zeit, die ich momentan nicht habe, für ne Bastelei für so eine
Kleinigkeit. Ich hatte gehofft es gäbe da eine einfachere Lösung als selbst
Malen.

Grüße
André
unknown
2006-06-23 13:10:42 UTC
Permalink
Hallo André!
Post by André Pönisch
Eigentlich am liebsten bei jeder der Zeilen innerhalb der Zelle.
Eine solche Darstellung ist nicht sehr gebräuchlich (ich habe zumindest noch
keine gesehen)
Post by André Pönisch
Ich hatte gehofft es gäbe da eine einfachere Lösung als
selbst Malen.
Da es eben keine "Standarddarstellung" ist, wirst sich das nicht vermeiden
lassen.


mfg GP
André Pönisch
2006-06-23 13:30:46 UTC
Permalink
Hallo Günter,
Post by unknown
Post by André Pönisch
Ich hatte gehofft es gäbe da eine einfachere Lösung als
selbst Malen.
Da es eben keine "Standarddarstellung" ist, wirst sich das nicht vermeiden
lassen.
Am idealsten fänd ich mittlerweile wenn ich ein weiteres DataGridView in
diese Zelle stecken könnte, das würde gleich ein paar andere Probleme mit
erschlagen.

Aber das geht wohl auch nicht.
Trotzdem danke euch.

Grüße
André
Loading...