Datagridview

11/12/2008 - 13:41 von mori_snowy | Report spam
Hallo,

ich habe folgendes Problem. Ich möchte die letzte Zeile in meinem
Datagridview komplette wieder löschen, wenn der User ESC gedrückt hat. Mit
welcher Routine (Ereignis) kann ich das unter VB .NET 2005 machen?

Zweites Problem: Ich arbeite mit dem Cell Validating Ereignis. Falls ein
bestimmter Wert in der ersten Zeile eingegeben wird, soll er in eine
bestimmte andere Zelle springen um dort eine weitere Eingabe zu machen.
Leider geht dann das Programm in eine Dauerschleife, weil ja immer wieder das
Cell Validating Ereignis zutrifft.

Um eine Lösung wàre ich sehr dankbar

Danke
 

Lesen sie die antworten

#1 Peter Götz
11/12/2008 - 18:57 | Warnen spam
Hallo,

wir stellen uns hier üblicherweise mit unserem vollen
Namen (Vor- u. Zuname) vor. Wàre schön, wenn Du
Dich dieser Gepflogenheit anschliessen würdest.

ich habe folgendes Problem. Ich möchte die letzte Zeile
in meinem Datagridview komplette wieder löschen,
wenn der User ESC gedrückt hat.



Das ist eigentlich ohnehin das normale Verhalten des DGV.

Wenn Du eine Zelle in einer bereits vorhandenen Zeile
ànderst und anschliessend ESC drückst, wird der bisherige
Zustand der Zelle wieder hergestellt.

Werden Zellen in der "neuen" Zeile des DGV beschrieben
und es wird anschliessend ESC gedrückt, wird zuerst die
zuletzt beschriebene Zelle wieder geleert und bei erneutem
Drücken von ESC wird die gesamte "neue" Zeile wieder
gelöscht.

Ansonsten kann der Benutzer eine beliebige Zeile mit dem
Zeilenmarkierer am linken Rand der jeweiligen Zeile markieren
und durch Drücken der "Entf"-Taste die gesamte Zeile löschen.


Mit welcher Routine (Ereignis) kann ich das unter
VB .NET 2005 machen?



s.oben:
Dazu brauchst Du gar keine besondere Routine.


Zweites Problem: Ich arbeite mit dem Cell Validating
Ereignis. Falls ein bestimmter Wert in der ersten Zeile
eingegeben wird, soll er in eine bestimmte andere Zelle
springen um dort eine weitere Eingabe zu machen.



Das CellValidating - Ereignis wird erst ausgelöst, wenn
die betr. Zelle verlassen wird, z.B. dann, wenn der Benutzer
in eine andere Zelle geklickt hat und da ist es eigentlich
schon zu spàt. Ausserdem klappt ein Zellenwechsel innerhalb
des CellValidating-Ereignisses nicht so ohne Weiteres.

Leider geht dann das Programm in eine Dauerschleife,
weil ja immer wieder das Cell Validating Ereignis zutrifft.



Das könnte man mit einer Flagvariable verhindern, aber
das CellValidating-Ereignis ist auch aus anderen Gründen
für Dein Vorhaben nicht geeignet.

Um eine Lösung wàre ich sehr dankbar



Schau Dir mal das nachfolgend Beispiel an.

' /// Code in einem leeren Formmodul (Form1)
Public Class Form1
Private WithEvents DGV As DataGridView
Private mDT As DataTable
Private mDV As DataView
Private mTBox As TextBox

Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load

DGV = New DataGridView
DGV.Dock = DockStyle.Fill
Me.Controls.Add(DGV)

CreateData()

With DGV
.DefaultCellStyle.Font = _
New Font("Arial", 12)

.ColumnHeadersDefaultCellStyle.Font = _
New Font("Arial", 8, FontStyle.Bold)

.DataSource = mDV
.AutoResizeColumns()
End With
End Sub

Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow
Dim Rnd As New Random(Now.Millisecond)

mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("SText", GetType(String))
.Columns.Add("LText", GetType(String))
.Columns.Add("RndNum", GetType(Integer))

For i = 1 To 12
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = MonthName(i, True)
DR.Item(2) = MonthName(i, False)
DR.Item(3) = Rnd.Next(20, 500)
.Rows.Add(DR)
Next
.AcceptChanges()
End With
mDV = New DataView(mDT)
End Sub

Private Sub DGV_EditingControlShowing _
(ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs _
) Handles DGV.EditingControlShowing

If mTBox Is Nothing Then
mTBox = DirectCast(e.Control, TextBox)
End If

If DGV.CurrentCellAddress.X = 1 Then
AddHandler _
mTBox.TextChanged, _
AddressOf mTBox_TextChanged

Else
RemoveHandler _
mTBox.TextChanged, _
AddressOf mTBox_TextChanged

End If
End Sub

Private Sub mTBox_TextChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs)

If mTBox.Text.ToUpper = "TEST" Then
DGV.CurrentCell = DGV.CurrentRow.Cells(3)
End If
End Sub
End Class
' \\\ E N T E

Im Beispiel wird erst eine DataTable (mDT) mit zugehöriger
DataView (mDV) erstellt, die DataTable mit Daten gefüllt und
dann ein DataGridView (DGV) an die DataTable (mDT) via
DataView (mDT) gebunden.

Wenn der Benutzer in Spalte 1 einen Text eingibt, wird der
Ereignishandler (mTBox_TextChanged) für die im DGV
enthaltene Textbox (DGV.EditingControl) eingeschaltet und
damit die Benutzereingabe fortlaufend überwacht. Wird in
der Textbox das Wort "Test" erkannt, wird autom. zur
Spalte 3 der selben Zeile gewechselt.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen