Laden...

[gelöst] Unterschiedliche Controls in einer Spalte des DataGridViews anzeigen

Erstellt von McSteel vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.059 Views
M
McSteel Themenstarter:in
43 Beiträge seit 2008
vor 14 Jahren
[gelöst] Unterschiedliche Controls in einer Spalte des DataGridViews anzeigen

Hallo,

ich habe da ein riesiges Problem, wo ich leider nicht mehr weiterkomme. 😉
Ich habe mein Freund Google.de wahrscheinlich die letzten 3 Tage überlastetet mit meiner Suche.

Es geht um die Darstellung und Verwendung verschiedener Steuerelemente in einer Spalte des DataGridViews. Zu den Steuerelementen zählen ComboBox mit unterschiedlichen Items, DataTimePicker, CheckedListBox, NumericUpDown ....

Ein Beispiel von mir um zwei Comboboxen mit unterschiedlichen Items zu generieren und sie in DatatGridView einzubinden:


      private void GenerateComboBox(int i)
      {
          try
          {
              //Anhand des i-Variablen weiss ich welche Control ausgewählt soll
              if (i == 123)
              {
                  cmb1 = new ComboBox();
                  cmb1.Dock = DockStyle.Fill;
                  cmb1.Name = "CMB1";
                  cmb1.Items.Add("0");
                  cmb1.Items.Add("1");
                  cmb1.Items.Add("2");
                  cmb1.Width = dataGridView1.Columns[3].Width;
                  if (!dataGridView1.EditingPanel.Controls.ContainsKey(cmb1.Name))
                      dataGridView1.EditingPanel.Controls.Add(cmb1);
                  cmb1.TextChanged += new EventHandler(cmb1_TextChanged);
                  cmb1.BringToFront();
              }
              else if (i == 124)
              {
                  cmb2 = new ComboBox();
                  cmb2.Dock = DockStyle.Fill;
                  cmb2.Name = "CMB2";
                  cmb2.Items.Add("EINS");
                  cmb2.Items.Add("ZWEI");
                  cmb2.Items.Add("DREI");
                  cmb2.Items.Add("VIER");
                  cmb2.Width = dataGridView1.Columns[3].Width;
                  if (!dataGridView1.EditingPanel.Controls.ContainsKey(cmb2.Name))
                      dataGridView1.EditingPanel.Controls.Add(cmb2);
                  cmb2.TextChanged += new EventHandler(cmb2_TextChanged);
                  cmb2.BringToFront();
              }
                        
         
          }
          catch(Exception ex)
          {
              System.Diagnostics.Debug.Write(ex.Message);
          }
      }

Aber es wird leider nur das eine in allen Zellen in einer Spalte angezeigt. Wieso? Was mache ich Falsch?

Gruß
mc

4.939 Beiträge seit 2008
vor 14 Jahren

Sorry McSteel, aber das ist vom DGV direkt nicht so vorgesehen, d.h. daß immer nur pro Spalte ein Control-Typ angezeigt wird.
Im Bearbeitungsmodus gibt es auch nur genau ein Control, das dann angezeigt wird, d.h. per Referenz (nicht als Kopie).

Schau dir mal die IDataGridViewEditingControl-Schnittstelle an, evtl. kannst du dann ein eigenes Control entwickeln, welches alle von dir benötigten Controls beinhaltet (und immer genau 1 Control davon anzeigt).

Eine einfache Sache ist das aber nicht...

Zum Hosten von Steuerelementen im DGV s. z.B.
MaskedTextBox in einer DataGridViewColumn
DateTimePickerColumn im DataGridView

M
McSteel Themenstarter:in
43 Beiträge seit 2008
vor 14 Jahren

Hallo TH69,

ja das habe ich festgestellt, dass das nicht so einfach ist. Aber ist möglich, denn ich habe ein .Net Applikation gefunden, indem diese Funktionen angewendet werden.

Das ich mir ein eigenes Control erstellen muß, wird mir auch so langsam bewusst.

Ich klappere gerade dieses Forum ab um zu sehen, ob ich doch noch so ein wenig Info finde, wie man sowas angehen kann. Aber ich habe schon einige sehr gute und interessante Einstellungspunkte und Bearbeitungsmöglichkeiten zu DGV entdeckt.

Vielen Dank für jede Hilfe
Lieben Gruß
mc

PS: Suche weiter...

M
McSteel Themenstarter:in
43 Beiträge seit 2008
vor 14 Jahren

Ich habe bei meiner Suche ein Sample gefunden, wo ansatzweise gezeigt, was ich suche, siehe oben.

Hier wird ein TextBox und ein ComboBox für eine Spalte in DataGridView angezeigt

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/34d4bc8a-a7b4-4cfd-82be-dc8b37acef28/

Punkt 1: Womit ich in erster Linie in diesem Sample nicht anfangen kann, sind this.oCodes und this.oData, wie müssen diese auschauen.


// this.oData is the DataTable that you are "viewing" in your Grid. It contains the column
// "mycodecolumn" which you wish to display as a ComboBox.

this.dataGridView1.DataBind(this.oData);
// this.oCodes is the DataSource of your Combo (a DataTable or a DataView), containing
//    the following two columns in it
// "description" is the DisplayMember
// "code" is the ValueMember 
this.dataGridView1.AddColumn("code", "Code", BBGridColumnTypes.ComboBox, this.oCodes, "description", "code");
this.dataGridView1.AddColumn("OtherStuff", "Other Stuff", BBGridColumnTypes.Standard);
this.dataGridView1.AddColumn("column5", "Another One", BBGridColumnTypes.Standard);

Punkt 2: Wie wollen die Classen BBComboBox und BBTextBox ausschauen? Da schlägt nämlich der Compiler.

Code Ausschnitt aus dem Sample

 
private BBComboBox oControl;


 #region Constructor

 public BBGridViewComboColumn()
  : base(new BBGridViewComboCell())
 {
  // used to set up the formatting
  oControl = new BBComboBox();
 }

 #endregion

M
McSteel Themenstarter:in
43 Beiträge seit 2008
vor 14 Jahren

SOOOO... Ich habs 😃

Mithilfe dieser Seite habe ich erfahren wie man Controls in DataGridView einbindet:
http://social.msdn.microsoft.com/Forums/en-US/winformsdesigner/thread/63ddb457-f769-44db-87cc-9e88e74929e8

und den DataError kann man wie folgt lösen:


        private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            if (e.Context == DataGridViewDataErrorContexts.Formatting)
            {
                e.ThrowException = false;
            }
            if (e.Context == DataGridViewDataErrorContexts.PreferredSize)
            {
                e.ThrowException = false;
            }
        }

und wieso, steht hier:
http://www.kebabshopblues.co.uk/2007/03/24/datagridviewcomboboxcell-errors-in-visual-studio-2005/

F
10.010 Beiträge seit 2004
vor 14 Jahren

Nur Wozu?

Das Editieren in einem Grid ist eine schlechte Benutzerführung.

Wenn du was schnelles brauchst nimm eine ListBox und ein PropertyGrid.
Beides an die selbe Bindingsource gebunden und schon Fertig.

Soll es etwas besser Konfigurierbar sein findest Du hier
http://www.codeproject.com/info/search.aspx?artkw=propertygrid&sbo=kw
genug Beispiele.

Deutlich einfacher zu Pflegen und zu Benutzen.

M
McSteel Themenstarter:in
43 Beiträge seit 2008
vor 14 Jahren

Gründe:

  1. PropertyGrid kenne ich, aber ein nachteil hat es, es ist nur zweispaltig. DataGridView ist mehrspaltig und diese wird an dieser Stelle gebraucht!

  2. Das DataGridView wird in diesem Projekt vorgegeben und kann mir nich aussuchen welches Control dort angwendet werden soll. Das Projekt an dem ich arbeite ist ein gemeinsames Projekt von über 20 Entwicklern.