Announcement

Collapse
No announcement yet.

Nur Zahlen in Datagridview zulassen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Nur Zahlen in Datagridview zulassen

    Wie bkomme ich es hin das in einer Spalte eines Datgridview nur Zahlen angenommen werden?

    Das nachfolgende kann ich leider nur auf eine Textbox anwenden.

    Danke schon mal für Eure Hilfe

    Private Sub txtBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtBox.KeyPress
    Select Case Asc(e.KeyChar)
    Case 48 To 57, 8
    ' Zahlen, und Backspace
    Case Else
    ' alle anderen Eingaben unterdrücken
    e.Handled = True
    End Select
    End Sub

  • #2
    Ich kann dir das Prinzip nur in C# zeigen sollte von dir aber natürlich entsprechend in VB.Net umgesetzt werden können.

    Entscheidender Dreh und Angelpunkt ist der EditingControlShowing Event des Grids. Der wird vor dem Editieren einer Zelle aufgerufen und enthält in den EventArgs das zum Editieren verwendete Control. In deinem Fall also wahrscheinlich eine TextBox. Im Event kann man sich dann dieses Control ranholen und die benötigten Events (z.b eben auch KeyPress) verdrahten. Gemerkt haben wir uns die Textbox um die Eventverdrahtung nach dem Editieren im CellEndEdit Event wieder aufzuheben damit die danach nicht mehr benötigte TextBox auch wirklich vom Garbage Collector zerstört wird und wir uns keine Speicherleck basteln.


    [Highlight=C#]
    private void textBox_KeyPress(object sender, KeyPressEventArgs e)
    {
    if (!char.IsNumber(e.KeyChar)) // hier noch durch intelligenteren Code ist hier nur Beispiel ersetzen
    e.Handled = true;
    }

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
    if (textBox != null)
    {
    textBox.KeyPress -= textBox_KeyPress;
    textBox = null;
    }
    }

    private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
    if (dataGridView1.CurrentCell.ColumnIndex != IndexDerBetroffenenSpalte) //Index der betroffenen Spalte noch ermitteln
    return;

    textBox = (e.Control as TextBox);
    if (textBox != null)
    textBox.KeyPress += textBox_KeyPress;
    }[/Highlight]

    Comment


    • #3
      Na erst mal vielen Dank.

      Mein CC ist schon lange her, ich werds mal versuchen in VB.NET umzusetzen.

      Einfacher wie oben gehts vermutlich nicht - Oder

      Comment


      • #4
        Problem noch nicht ganz gelöst

        Diesen Code habe ich gefunden er funktioniert bis auf
        "InitialisiereDgv()"
        Da meckert der Compiler
        Der Name "InitialisiereDgv" wurde nicht deklariert.

        Was muss ich denn da tun ?

        Dim Dgv As New DataGridView
        Private Sub Form1_Load(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles MyBase.Load
        InitialisiereDgv()
        AddHandler Dgv.EditingControlShowing, _
        AddressOf Dgv_EditingControlShowing
        End Sub
        Private Sub Dgv_EditingControlShowing(ByVal sender As Object,
        ByVal e As DataGridViewEditingControlShowingEventArgs)
        Dim Tb As TextBox = CType(e.Control, TextBox)
        RemoveHandler Tb.KeyPress, AddressOf Tb_KeyPress
        AddHandler Tb.KeyPress, AddressOf Tb_KeyPress
        End Sub

        Private Sub Tb_KeyPress(ByVal sender As Object, _
        ByVal e As KeyPressEventArgs)
        If e.KeyChar <> vbBack Then
        Select Case Dgv.CurrentCell.ColumnIndex
        Case 0
        If Not Char.IsDigit(e.KeyChar) Then e.Handled = True
        Case Else
        If Not Char.IsLetter(e.KeyChar) Then e.Handled = True
        End Select
        End If
        End Sub

        Comment


        • #5
          Erstens - du hast Code der nicht kompiliert von dem du aber weißt das er funktioniert. Wie hast du das rausbekommen? Karten legen, Knochen befragen, Geomantie?

          Zweitens - InitialisiereDgv() ist ein Methodenaufruf. Hast du den in deinem Code eine InitialisiereDgv() Methode?

          Drittens - Code bitte formatieren liest sich sonst so schlecht. Wie steht im ersten Posting 'Hinweise und Formatierung von VB.net-Code' in diesem Forum.

          Comment


          • #6
            Zweitens - InitialisiereDgv() ist ein Methodenaufruf. Hast du den in deinem Code eine InitialisiereDgv() Methode?

            Nein ich habe keine Initialisierungs Methode, dass genau ist ja meine Frage.
            Was muss ich denn da initialisieren. Wie sieht das denn aus.
            Ich denke ich muss dem DGV mein Datagridview1 irgendwie übergeben aber wie?

            Die Aussage ist richtig, kann ich tatsächlich nicht wissen ob der Code funktioniert aber wenn ich "InitialisiereDgv()" auskommentire läßt sich zumindest mal das Programm kompilieren.

            Comment


            • #7
              Nein ich habe keine Initialisierungs Methode, dass genau ist ja meine Frage.
              Was muss ich denn da initialisieren. Wie sieht das denn aus.
              Dort wo du denn Code gefunden hast einfach mal den beschreibenden Text lesen.

              Comment


              • #8
                Erst mal Danke aber auf der Seite auf der ich es fand steht nur das auf die Methode hier nicht näher eingegangen wird. Siehe Link
                http://www.microsoft.com/germany/msd...aGridView.mspx

                Vielleicht kannst Du mir ja doch noch helfen

                Comment


                • #9
                  Dort steht

                  Die Methode InitialisiereDgv fügt die Spalten und Zeilen zum Objekt Dgv
                  sowie das Objekt Dgv zu den Steuerelementen des Formulars hinzu. Sie ist hier nicht dargestellt.
                  Brauchst du das? Wenn ja programmiere es in eine InitialisiereDgv() Methode. Wenn nicht, weil du z.B. das DGV schon per Winforms Designer eingestellt hast, lass sie weg.

                  Comment


                  • #10
                    Es könnne nach wie vor Buchstaben eingegeben werden.

                    Ich erstelle ein Datagridview1 mittels VB.NET Desiger
                    Dieses Dattagrid wird anschließend mit Daten gefüllt.

                    DataGridView1.DataSource = ds.Tables("BelegePositionen")

                    Wie muss dann die InitialisierungDGV aussehen?

                    Weglassen funktioniert nicht, ich kann immer noch alles eingeben.

                    Comment


                    • #11
                      Da der Code scheinbar jetzt zumindest kompiliert wäre für dich jetzt die Aufgabe rauszufinden wie er funktioniert. Wenn du das einfach mal debuggst, insbesondere rausfindest ob du in Tb_KeyPress landest(oder in einem der beiden anderen Events) und was im Event passiert, solltest du dann erkennen können warum es nicht so funktioniert wie du denkst.

                      Wir sind an einem Punkt wo ich nicht unbedingt weiterhelfen will, da du mir nur das Gefühl gibst einfach unverstanden Code in deine Projekt zu kopieren ohne zu versuchen ihn zu verstehen(Lego Programming). Debug den Code und wenn du dann ein konkretes Problem hast das sich dir nicht erschließt können wir weitersehen.

                      Comment


                      • #12
                        So jetzt habe ich es gelöst manchmal sieht man vor Bäumen den ganzen Wald nicht.

                        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                        AddHandler DatagridView1.EditingControlShowing, AddressOf Dgv_EditingControlShowing
                        End Sub

                        Private Sub Dgv_EditingControlShowing(ByVal sender As Object, ByVal e As _ DataGridViewEditingControlShowingEventArgs)
                        Dim Tb As TextBox = CType(e.Control, TextBox)
                        RemoveHandler Tb.KeyPress, AddressOf Tb_KeyPress
                        AddHandler Tb.KeyPress, AddressOf Tb_KeyPress
                        End Sub

                        Private Sub Tb_KeyPress(ByVal sender As Object, _
                        ByVal e As KeyPressEventArgs)
                        If e.KeyChar <> vbBack Then
                        Select Case DataGridView.CurrentCell.ColumnIndex
                        Case 0
                        If Not Char.IsDigit(e.KeyChar) Then e.Handled = True
                        Case Else
                        If Not Char.IsLetter(e.KeyChar) Then e.Handled = True
                        End Select
                        End If
                        End Sub

                        Comment

                        Working...
                        X