|
| » myCSharp.de Diskussionsforum |
|
|
|
|
Autor
 |
|
diana
myCSharp.de-Mitglied
Dabei seit: 07.12.2004
Beiträge: 548
Entwicklungsumgebung: VS 05, 10; C#; NET 2.0, 4.0 Herkunft: Sachsen
|
|
Hallo,
suche leider vergebens nach einem vernünftigen Ansatz für oben genanntes Problem. Eine DataGridViewComboBoxColumn soll z.B. rot markierte Einträge enthalten, wenn eine andere Spalte im Dataset (Datenquelle) true/false ist.
Das Problem ist wohl eher die Anzeige beim aufklappen der Combobox-Spalte, dass da dann die markierten Items auch wie gewünscht angezeigt werden. Hat jemand eine Idee?
|
|
17.04.2012 08:24
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
herbivore
myCSharp.de-Team (Admin)
Dabei seit: 11.01.2005
Beiträge: 47.496
Entwicklungsumgebung: csc/nmake (nothing is faster) Herkunft: Berlin
|
|
Hallo diana,
das wird wohl nur mit einer OwnerDrawn-ComBobox gehen. Ob DataGridViewComboBoxen OwnerDrawn sein können, weiß ich allerdings nicht.
herbivore
|
|
17.04.2012 08:52
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
Console32
myCSharp.de-Mitglied
Dabei seit: 19.12.2011
Beiträge: 206
|
|
Du kannst das OnCellPaint vom DGV verwenden um selbst zu Zeichnen oder einfach die DGVComboBoxColumn & DGVComboBoxCell ableiten und das Paint überschreiben
C#-Code: |
public class MyDataGridViewColumn: DataGridViewComboBoxColumn
{
public override DataGridViewCell CellTemplate
{
get { return new MyDataGridViewCell(); }
}
}
public class MyDataGridViewCell : DataGridViewComboBoxCell
{
protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
{
.....
}
}
|
EDIT: geht bei einer ComboBox nicht wie gewünscht (siehe unten)
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Console32 am 17.04.2012 11:15.
|
|
17.04.2012 09:56
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
Console32
myCSharp.de-Mitglied
Dabei seit: 19.12.2011
Beiträge: 206
|
|
Bei der Combobox läuft das wohl anders habs gerade ausprobiert.
Das hier könte helfen
C#-Code: |
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if(e.Control is ComboBox)
((ComboBox)e.Control).DrawItem += new DrawItemEventHandler(Form1_DrawItem);
}
void Form1_DrawItem(object sender, DrawItemEventArgs e)
{
}
|
Source DGVComboBox mit Icons
|
|
17.04.2012 11:14
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
diana
myCSharp.de-Mitglied
Dabei seit: 07.12.2004
Beiträge: 548
Entwicklungsumgebung: VS 05, 10; C#; NET 2.0, 4.0 Herkunft: Sachsen
Themenstarter
|
|
Danke. Werde ich mal probieren!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von diana am 17.04.2012 13:29.
|
|
17.04.2012 13:29
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
herbivore
myCSharp.de-Team (Admin)
Dabei seit: 11.01.2005
Beiträge: 47.496
Entwicklungsumgebung: csc/nmake (nothing is faster) Herkunft: Berlin
|
|
Hallo diana,
da es doch einige Klassen, Interfaces, Beziehungen und Unbekannte im Spiel sind, wird das wohl kaum jemand nur nach deiner Beschreibung bestätigen können. Man müsste es ausprobieren. Das kannst und solltest du jedoch am besten selber machen. Wenn Probleme konkrete damit auftauchen, die du genau beschreibst, ist es vermutlich wieder einfacher zu helfen.
herbivore
|
|
24.04.2012 07:58
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
diana
myCSharp.de-Mitglied
Dabei seit: 07.12.2004
Beiträge: 548
Entwicklungsumgebung: VS 05, 10; C#; NET 2.0, 4.0 Herkunft: Sachsen
Themenstarter
|
|
Ich habe es vorerst noch mal mit dem EditingControlShowing-Event des DataGridView versucht:
C#-Code: |
private void dgrv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
((ComboBox)e.Control).DrawMode = DrawMode.OwnerDrawFixed;
((ComboBox)e.Control).DrawItem += new DrawItemEventHandler(Frm_DrawItem);
}
|
C#-Code: |
private void Frm_DrawItem(object sender, DrawItemEventArgs e)
{
ComboBox cbo = (ComboBox)sender;
int yPostition = (e.Index - cbo.Top) * cbo.ItemHeight + 100;
e.Graphics.DrawString(ds.dt[0]["ANZEIGE_NAME"].ToString(), cbo.Font, new SolidBrush(Color.Blue), 0.0f, yPostition);
}
|
Kurz: Ich würde gern bestimmte Items in der DataGridViewComboBox farbig hervor heben! Nach dem obigen ersten wackligen Testcode, bekomme ich zwar farbige Einträge, aber irgentwo im Control und meine Datenbankeinträge aus meinem ds, weiß ich leider auch noch nicht, wie ich die reinbringe, da dieses DrawItem-Event immer ausgeführt wird, wenn ich mit der Mouse drauf binim ausgeklappten Zustand. Vielleicht traut sich jemand ran...:/
Wichtig ist auch erstmal wie zeichne ich die Items, die aus dem DataSet kommen, hab es schon auf die herkömmliche versucht, hat nicht funktioniert.
|
|
24.04.2012 09:03
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
Console32
myCSharp.de-Mitglied
Dabei seit: 19.12.2011
Beiträge: 206
|
|
Du hast ja den Text sowieso in deiner ComboBox (weil du ja deine daten darauf gemappt hast)
C#-Code: |
string text = ((ComboBox)sender).Items[e.Index].ToString();
|
Dann fragst du deine Bedingungen ab,
C#-Code: |
if(text.Contains("whatever"))
myBrush = Brushes.Purple;
|
und am ende Zeichnest du das ganze noch
C#-Code: |
e.DrawBackground();
e.Graphics.DrawString(text, ((Control)sender).Font, myBrush, e.Bounds.X, e.Bounds.Y);
|
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Console32 am 24.04.2012 10:27.
|
|
24.04.2012 10:27
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
diana
myCSharp.de-Mitglied
Dabei seit: 07.12.2004
Beiträge: 548
Entwicklungsumgebung: VS 05, 10; C#; NET 2.0, 4.0 Herkunft: Sachsen
Themenstarter
|
|
Vielen Dank für deine Antwort. Gemappt heit sicherlich an eine Datenspalte gehangen, dass habe ich per:
C#-Code: |
this.col = new DataGridViewComboBoxColumn();
this.col.DataSource = ds.Tables["Name"].DefaultView;
this.col.DataPropertyName = "NR";
this.col.ValueMember = "NR";
this.col.DisplayMember = "ANZEIGE_NR";
|
realisiert, aber sobald ich das DrawItem-Event verwende, wir kein Eintrag als Textitem in der Combobox angezeigt. Während der Laufzeit ist text auch leider null, also hat die Combobox die Daten doch noch nicht oder nicht mehr, obwohl, was etwas verwundert, die Länge der Count auf die Items stimmt nur der text wird eben nicht abgezeigt:/
|
|
24.04.2012 10:37
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
diana
myCSharp.de-Mitglied
Dabei seit: 07.12.2004
Beiträge: 548
Entwicklungsumgebung: VS 05, 10; C#; NET 2.0, 4.0 Herkunft: Sachsen
Themenstarter
|
|
Ich dachte text = ((ComboBox)sender).Items[e.Index].ToString(); hat die einzelnen Items!
Also brauche ich eine solche benutzerdefinierte Combobox? Leider wurde auch nicht beschrieben, wo ich das Add der Items vornehme, im DrawItem? oder vorher?
Habe mal versucht im DrawItem mein ds per Foreach duchzugehen und dann die Einträge per Add zu setzen, da zeigt mir die ComboBox leider nur System.Data-DataRowView an. (Habe den Code zum Test schnell kopiert)
C#-Code: |
e.DrawBackground();
Brush brush;
try
{
foreach (DataRow dr in ds.dt.Rows)
{
((ComboBox)sender).Items.Add(dr["ANZEIGE_NAME"].ToString());
}
}
catch { }
string text = ((ComboBox)sender).Items[e.Index].ToString();
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
brush = Brushes.Yellow;
}
else
{
brush = Brushes.Red;
}
e.Graphics.DrawString(text, ((Control)sender).Font, brush, e.Bounds.X, e.Bounds.Y);
|
Leider sehe ich immer noch nicht so richtig durch, was noch fehlt:/
|
|
24.04.2012 11:15
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
Console32
myCSharp.de-Mitglied
Dabei seit: 19.12.2011
Beiträge: 206
|
|
Also du Lädst ja Irgendwo dein DataSet, dannach solltest du deine ComboBox Items auffüllen, (nicht im Interface / sonst hast du in einer InterfaceMethode einen zugriff auf BackgroundDaten was nicht schön ist)
also nachdem dein DataSet Complet ist füllst du deine CombBox
C#-Code: |
((ComboBox)sender).Items.Add(dr["ANZEIGE_NAME"].ToString())
|
was du hier machst ist denke ich falsch weil du deine Items mit DataRows auffüllst und nicht mit DataCells (das ToString auf eine DataRow gibt nur den KlassenNamen)
C#-Code: |
((ComboBox)sender).Items.Add(dr["ANZEIGE_NAME"].Cells[0].ToString())
|
Würde dir zum Beispiel den wert in der ersten Spalte geben.
EDIT: Stimmt war falsch aber wie man mit einem DataSet arbeitet findest du bestimmt selbst raus.
In deiner DrawItem Methode solltest du dann wieder die Items verwenden so wie es im link Oben auch gemacht wurde.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Console32 am 24.04.2012 12:14.
|
|
24.04.2012 11:30
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
diana
myCSharp.de-Mitglied
Dabei seit: 07.12.2004
Beiträge: 548
Entwicklungsumgebung: VS 05, 10; C#; NET 2.0, 4.0 Herkunft: Sachsen
Themenstarter
|
|
.Cells wird in diesem Zusammenhang gar nicht angeboten...
Wie man mit einem DataSet arbeitet ist nicht das Problem, sondern das Arbeiten mit einer DataGridViewComboBoxColumn...:/
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von diana am 24.04.2012 13:55.
|
|
24.04.2012 11:39
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
diana
myCSharp.de-Mitglied
Dabei seit: 07.12.2004
Beiträge: 548
Entwicklungsumgebung: VS 05, 10; C#; NET 2.0, 4.0 Herkunft: Sachsen
Themenstarter
|
|
Daten werden nun aus dem Dataset in die DataGridViewComboBoxColumn geladen, nur leider bringt:
C#-Code: |
((ComboBox)sender).Items[e.Index].ToString();
|
im DrawItem immer -1 als Index, sodass kein Item in der DataGridViewComboBoxColumn angezeigt wird. Ich habe es mal mit 0 ausprobiert, da kommt mein erster Eintrag korrekt.
Nun also die nächste Frage, wie komme ich an einen e.Index, sodass mein DrawIndex-Event die Einträge ordentlich anzeigen kann? Momentan siehts so aus, dass ich nur statisch den Index setzen kann z.B. 0 und so wird mein erster Eintrag soviel mal wie Items.Count angezeigt, was ja logisch ist:/ Ich brauche also den "dynamischen Index"?
|
|
24.04.2012 16:10
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
Console32
myCSharp.de-Mitglied
Dabei seit: 19.12.2011
Beiträge: 206
|
|
EDIT:
Ich glaube -1 steht für den Header?
Frag einfach auf -1 ab und mach in dem Fall nichts.
Hab ein dummy Projekt erstellt:
C#-Code: |
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
((ComboBox)e.Control).DrawMode = DrawMode.OwnerDrawFixed;
((ComboBox)e.Control).DrawItem += new DrawItemEventHandler(Form1_DrawItem);
}
void Form1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index == -1)
return;
e.DrawBackground();
Brush brush;
string text = ((ComboBox)sender).Items[e.Index].ToString();
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
brush = Brushes.Yellow;
}
else
{
if (text.Contains("special"))
brush = Brushes.Red;
else
brush = Brushes.Black;
}
e.Graphics.DrawString(text, ((Control)sender).Font, brush, e.Bounds.X, e.Bounds.Y);
}
private void Form1_Load(object sender, EventArgs e)
{
((DataGridViewComboBoxColumn)this.dataGridView1.Columns[0]).Items.AddRange(new string[] { "test", "special", "test", "test", "test", "test" });
}
}
|
Nichts für ungut, aber das hat mich ca 5 Minuten gekostet um das auszuprobieren und es funktioniert, mehr eigeninitiative beim nächsten mal
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Console32 am 25.04.2012 09:52.
|
|
25.04.2012 09:48
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
|
|