none
Datagridview und textbox RRS feed

  • Frage

  • Hallo zusammen,

    Ich habe folgende Situation.  1 Form mit 2 bounded Datagridviews und 1 Textbox
    Im datagridview1 werden kunden angezeigt und im datagridview2 die dazugehörigen projekte. d.h. ändert sich der currentcellindex im datagridview1, werden automtisch im datagirdview2 die projelte geladen. Das funktioniert auch.
    mit der textbox möchte ich zu kundennamen im datagridview1 springen, d.h. ich gebe die anfangsbuchstaben in der textbox ein und mir werden die kundennamen vorgeschlagen und angehängt und die currenrow springt zum 1. gefundenen eintrag. Problem ist nur, dass das nur zu 90% funktioniert. bei den anderen nicht reproduzierbaren fällen wird entweder das texchanged event der textbox nicht gefeuert oder das currentcellindexchanged event des datagridview1??? folglich werden in diesen fällen nicht die richtigen projekte des ausgewählten kunden angezeigt.

    Ich bitte um hilfe.

    Mittwoch, 27. Januar 2010 10:40

Antworten

  • danke elmar,
    ich benutze eine datatable im dataset jeweils mit bindingsource. also das heißt zusätzlich zur datagridview noch die dataview benutzen?
    also ich lande schon beim richtigen treffer, aber dann werden nicht die zu dieser ID gehörenden projekete geladen.
    habs bisher noch nicht ausprobiert, da ich im urlaub war.
    kann aber auch gerne mal den code posten:

    Code des Textbox-Changed event:
    Private Sub textbox1_textchanged(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.TextChanged
            Dim DField As String
            DField = m_CSCDP
    
            Dim dr As DataRow() = DataSet11.Table.Select(DField + " Like '" & TextBox1.Text & "%'", DField)
            Dim t As New DataTable
            If dr.GetUpperBound(0) >= 0 Then
                Dim s As String = ""
                If Me.DataGridView1.SortOrder.ToString = "Ascending" Then
                    s = " asc"
                Else
                    s = " desc"
                End If
                DataSet11.Table.DefaultView.Sort = DField + s
                DataGridView1.FirstDisplayedScrollingRowIndex = DataSet11.Table.DefaultView.Find(dr(0).Item(DField).ToString)
                Me.DataGridView1.CurrentCell = DataGridView1.Item(Me.DataGridView1.FirstDisplayedScrollingColumnIndex, DataSet11.Table.DefaultView.Find(dr(0).Item(DField).ToString))
                Me.CityIndex = DataSet11.Table.DefaultView.Find(dr(0).Item(DField).ToString)
            Else
                m_Proj.FillDG(m_CID)
            End If
             Me.Button1.Text += sender.Text
              Me.TextBox1.Focus()
        End Sub

    Code des DataGridView1_CurrentCellChanged event:
    Private Sub DataGridView1_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellChanged
            If Me.DataGridView1.Rows.Count > 0 Then
                Dim pt As Point = DataGridView1.PointToClient(Cursor.Position)
                Dim hti As DataGridView.HitTestInfo = DataGridView1.HitTest(pt.X, pt.Y)
                If hti.Type = DataGrid.HitTestType.ColumnHeader Then
                    Exit Sub
                End If
                Try
                   RowData() 
                   m_Proj.FillDG(m_CID)
                Catch ex As Exception


    End Try Else m_Proj.FillDG("0") End If End Sub
     Private Sub RowData()
            If Not DataGridView1.CurrentRow Is Nothing Then
                CurrGridRow = DataGridView1.CurrentRow
                m_CID = DirectCast(CurrGridRow.DataBoundItem, DataRowView).Item("ID")
           End If
     End Sub


    Grüße
    Jörg
    • Als Antwort markiert goldjoat Mittwoch, 7. April 2010 10:23
    Donnerstag, 18. Februar 2010 14:06

Alle Antworten

  • Hallo,

    ohne den Code zu sehen, den Du für die Suche verwendest - ist das schwer zu beantworten.

    Da Du gebundene DataGridView(s) verwendest, wäre es sinnvoller direkt in den Datenquellen zu suchen.
    Hast Du an eine DataSet/DataTable (mit oder ohne BindingSource) gebunden,
    so solltest Du die zugrundeliegende DataView verwenden.
    Ddenn ansonsten kann es schon durch abweichende Sortierungen dazu führen,
    dass ein "Treffer" auf einer falschen Zeile landet.

    Gruß Elmar
    Mittwoch, 27. Januar 2010 10:56
    Beantworter
  • Hallo goldjoat,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Mittwoch, 3. Februar 2010 10:36
    Moderator
  • danke elmar,
    ich benutze eine datatable im dataset jeweils mit bindingsource. also das heißt zusätzlich zur datagridview noch die dataview benutzen?
    also ich lande schon beim richtigen treffer, aber dann werden nicht die zu dieser ID gehörenden projekete geladen.
    habs bisher noch nicht ausprobiert, da ich im urlaub war.
    kann aber auch gerne mal den code posten:

    Code des Textbox-Changed event:
    Private Sub textbox1_textchanged(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.TextChanged
            Dim DField As String
            DField = m_CSCDP
    
            Dim dr As DataRow() = DataSet11.Table.Select(DField + " Like '" & TextBox1.Text & "%'", DField)
            Dim t As New DataTable
            If dr.GetUpperBound(0) >= 0 Then
                Dim s As String = ""
                If Me.DataGridView1.SortOrder.ToString = "Ascending" Then
                    s = " asc"
                Else
                    s = " desc"
                End If
                DataSet11.Table.DefaultView.Sort = DField + s
                DataGridView1.FirstDisplayedScrollingRowIndex = DataSet11.Table.DefaultView.Find(dr(0).Item(DField).ToString)
                Me.DataGridView1.CurrentCell = DataGridView1.Item(Me.DataGridView1.FirstDisplayedScrollingColumnIndex, DataSet11.Table.DefaultView.Find(dr(0).Item(DField).ToString))
                Me.CityIndex = DataSet11.Table.DefaultView.Find(dr(0).Item(DField).ToString)
            Else
                m_Proj.FillDG(m_CID)
            End If
             Me.Button1.Text += sender.Text
              Me.TextBox1.Focus()
        End Sub

    Code des DataGridView1_CurrentCellChanged event:
    Private Sub DataGridView1_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellChanged
            If Me.DataGridView1.Rows.Count > 0 Then
                Dim pt As Point = DataGridView1.PointToClient(Cursor.Position)
                Dim hti As DataGridView.HitTestInfo = DataGridView1.HitTest(pt.X, pt.Y)
                If hti.Type = DataGrid.HitTestType.ColumnHeader Then
                    Exit Sub
                End If
                Try
                   RowData() 
                   m_Proj.FillDG(m_CID)
                Catch ex As Exception


    End Try Else m_Proj.FillDG("0") End If End Sub
     Private Sub RowData()
            If Not DataGridView1.CurrentRow Is Nothing Then
                CurrGridRow = DataGridView1.CurrentRow
                m_CID = DirectCast(CurrGridRow.DataBoundItem, DataRowView).Item("ID")
           End If
     End Sub


    Grüße
    Jörg
    • Als Antwort markiert goldjoat Mittwoch, 7. April 2010 10:23
    Donnerstag, 18. Februar 2010 14:06