Textbox zu einem DataGridView hinzufügen vb.net 2005

ronaldo84

Erfahrenes Mitglied
Hallo Gemeinde,

folgendes Problem:
Ich habe ein DataGridview. Dieses Grid hat u.a.zwei Spalten. Eine DataGridViewComboboxColumn (Versandform) und eine DataGridViewTextboxColumn (Versandformfreitext). Die ComboxColumn hat eine BindingSoruce als DataSource (Valuemember ein Int und Displaymember ein Text) und die TextSpalte ein normales DB-Feld. Wenn nun das Value der ComboBox <Null> ist und das der Textbox != <Null> soll eigentlich der Text der Textspalte in der ComboBox-Spalte angezeigt werden. Da das mit dem DataBoundItem nicht so einfach sein dürfte habe ich mir gedacht das ich einfach ein Textfeld über die Combobox lege. Soweit bin ich bis jetzt gekommen:
Visual Basic:
Private Sub dgvPreviewVerteiler_RowsAdded(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles dgvPreviewVerteiler.RowsAdded

    If e.RowIndex = -1 Then Return
    Dim dgv As DataGridView = CType(sender, DataGridView)
    If dgv.Columns Is Nothing Or dgv.Columns.Count = 1 Then Return
    dgv.Controls.Clear()
    If (__RowsCompleteAdded) Then
      Dim LeftMargin As Integer = GetLeftMargin(dgv, dgv.Columns("VersandFormID").Index)
      For Each row As DataGridViewRow In dgv.Rows
        If ((row.Cells("VersandFormID").Value Is DBNull.Value) And _
            (row.Cells("Versandformtext").Value IsNot DBNull.Value)) Then
          Dim txt As New TextBox 
          txt.location = New Point(LeftMargin , dgv.GetCellDisplayRectangle(dgv.Columns("VersandFormID").Index, row.Index, False).Top)
          txt.Text = row.Cells("Versandformtext").Value.ToString()
          txt.Size = row.Cells("Versandformtext").Size
          dgv.Controls.Add(txt)
        End If
      Next
    End If
    __RowsCompleteAdded = Not __RowsCompleteAdded
  End Sub


Das Textfeld wird auch hinzugefügt. Leider ist das Scrollverhalten nicht korrekt d.h. das Textfeld wird nich rausgescrollt, sondern es scrollt mit und verdeckt so die anderen Spalten. Wenn der berechnete Abstand nach Link größer ist als das DataGridView wird die Texbox überhaupt nicht angezeigt, da sie denke ich mal aus dem sichtbaren Bereich herausgescrollt wird.

Nun meine Frage: Weiß jemand wie ich das schaffen könnte? Habe auch schon überlegt mir eine eigene DataGridViewComboBoxTexboxColumn abzuleiten. Denke aber das wäre noch aufwendiger.

Vielen Dank für die Mühe.
 
du hast doch ein Objekt welches du bindest an dein DataGridView.

Dieses Objekt sollte die Schnittstelle INotifyPropertyChanged implementiert haben.
Darüber könntest du die Eigenschaft die für deine Combo steht steuern.

Ungefähr so:
Code:
class meineClass : INotifyPropertyChanged
{
   public string meine ComboEingeschaft
   {
       get
       {
              if(string.IsNullOrEmpty(MeineTextBoxEigenschaft))
                    return "blabliblub";
              else
                    return "dadidum";
       }
       set
       {
               ... 
               OnPropertyChanged("ComboEingeschaft"); 
       }
   }

   publis tring MeineTextBoxEigenschaft
   {
         set
         { 
              ....
              OnPropertyChanged("MeineTextBoxEigenschaft"); 
              OnPropertyChanged("ComboEingeschaft"); 
         }
   }

   OnPropertyChanged(string proeprtyName)
   {
         if(PropertyChanged!=null)
              PropertyChanged(this, new ProeprtyChangedEventArgs(proeprtyName));
   }
}

hm
ev. bei der Liste die fürs Combo gebunden wird noch mit diesem zusätzlichen Objekt fürs nixs hinzufügen?
Denn beim überfliegen glaube bei Datenbinding für die Combo bringt dich das oben nicht weiter.
 
Hallo Skype,

danke für deine Antwort. Also würdest du mir doch empfehlen ein neues Kontroll abzuleiten?
 
Ich habe irgendwie probleme mich in dein Problem hinein zu denken :suspekt:
Aber wenn ich das richtig verstanden habe willst du 2 Zellen verbinden bei bestimmten Eigenschaften.
Und ich glaube dazu gibts Beispiele bei codeproject, musst dort mal suchen.
Ansonsten würde ich mal schaun ob man das über das CellPainting Ereignis lösen könnte. Sprich selbst zeichnen.

Oder probiers über BindingList<T> und füge einfach ein Objekt das dem Wert deiner Textspalte entspricht an. Ev. die alten Einträge löschen. Durch die BindingList sollte er mitkommen das er sich neu zeichnen soll.
 
Nein, das ist leider odhc etwas falsch wie du es verstanden hast.
Ich habe in einem Datagrid 2 Spalten. Eine Spalte vom Typ Combobox (Name VersandformID) und eine vom Typen Textbox (Name Versandformtext). Nun ist eine Anforderung an das Programm das man entweder die Versandform in der combobox auswählen kann oder über die Textbox eine vollkommen neue einzugeben. Das kann ich über die zwie Spalten ja machen. Nun würde ich es aber gerne über nur eine Spalte realisieren, d.h. wenn der Benutzer einen unbekannten Text eingibt soll in der Spalte eine Textbox eingeblendet werden und wenn der Teext bekannt soll eine Combobox dargestellt werden. Ich habe mir dazu folgendes gedacht:
Ich füge noch eine dritte ungebundene Spalte ein. Die beiden gebundenen Spalten (Versandform ID und Versandformtext) werden ausgeblendet. Nun soll je nach Daten die Celle der ungebundenen Spalte die Typ der Celle sein die ausgefühlt ist. Dazu habe ich jetzt folgenden Code:

Visual Basic:
  Private Sub Tbl_VerteilerListeDataGridView_DataBindingComplete(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) Handles Tbl_VerteilerListeDataGridView.DataBindingComplete
    Dim dgv As DataGridView = CType(sender, DataGridView)
    If (Not dgv.Columns.Contains("VersandFormID") Or Not dgv.Columns.Contains("Versandformtext") Or Not dgv.Columns.Contains("Versandform")) Then Return
    For Each row As DataGridViewRow In dgv.Rows
      AddMixedCells(row, "VersandFormID", "Versandformtext", "Versandform")
    Next

  End Sub
  Private Sub AddMixedCells(ByVal row As DataGridViewRow, ByVal ParamArray Columns() As String)

    For index As Integer = 0 To Columns.Length - 1 Step 3
      Dim cell As DataGridViewCell
      If (row.Cells(Columns(index)).Value Is DBNull.Value And row.Cells(Columns(index + 1)).Value IsNot DBNull.Value) Then
        cell = CType(row.Cells(Columns(index + 1)).Clone, DataGridViewTextBoxCell)
        cell.Value = row.Cells(Columns(index + 1)).Value
      ElseIf (row.Cells(Columns(index)).Value IsNot DBNull.Value And row.Cells(Columns(index + 1)).Value Is DBNull.Value) Then
        cell = CType(row.Cells(Columns(index)).Clone, DataGridViewComboBoxCell)
        cell.Value = row.Cells(Columns(index)).Value
      Else
        cell = CType(row.Cells(Columns(index)).Clone, DataGridViewComboBoxCell)
      End If
      row.Cells(Columns(index + 2)) = cell
    Next
  End Sub
End Class
Soweit so gut. Da die dritte Spalte aber ungebunden ist und die Daten gespeichert werden sollen müßte ich nach Änderung des Inhaltes der ungebundenen Spalte den Text in die gebundenen Spalten schreiben. Dabie scheitert es gerade. Hat jemand eine Idee?

Vielen Dank
 
Zurück