Forums Neueste Beiträge
 

DGV: Neuen Wert von CheckBoxColumn in ClickEvent ermitteln

21/07/2009 - 12:34 von Alexander Mueller | Report spam
Hallo


Ich würde gerne in dem Moment, wo ein Haken in eine CheckBoxColumn
(in einem DGV, WinForms, .NET 2.0) gesetzt wird, schon beim Setzen des
Hakens - also bevor dgv.CellValidating oder dgv.CellValueChanged
gefeuert wurden - eine Aktion ausführen, die den neuen Wert
vorwegnimmt.

Das mach ich aktuell in einem Handler für dgv.CellClick, weil es in der
Regel über einen Mausklick aktiviert wird.

Der neue Wert ist dann aber weder in
dgv.Rows[rowIndex].Cells[columnIndex].Value;
noch in:
//dataTable ist die DataSource des DGV
dataTable.Rows[rowIndex][columnIndex];

abrufbar, weil der Edit in diesem Moment ja noch nicht fertig ist.
Gibt es ein Event, das mir beide Werte (den der der gerade dabei ist,
gesetzt zu werden und den alten) liefert?

Ich könnte natürlich - bei CheckBoxColumn und boolschen Werten -
einfach den gegenteiligen Wert nehmen. Ein Event, das mir die Edit-Daten
zuverlàssig liefert, wàre mir aus Prinzip aber lieber, es soll
prinzipiell auch bei anderen Spaltentypen, wo der neue Wert beliebig
sein kann, gehen.

Danke für alle Tipps,
Alex
 

Lesen sie die antworten

#1 Peter Götz
21/07/2009 - 14:10 | Warnen spam
Hallo Alexander,

Ich würde gerne in dem Moment, wo ein Haken in eine
CheckBoxColumn (in einem DGV, WinForms, .NET 2.0)
gesetzt wird, schon beim Setzen des Hakens - also bevor
dgv.CellValidating oder dgv.CellValueChanged
gefeuert wurden - eine Aktion ausführen, die den neuen Wert
vorwegnimmt.

Das mach ich aktuell in einem Handler für dgv.CellClick,
weil es in der Regel über einen Mausklick aktiviert wird.



Nimm besser DGV_CellContentClick, weil das bei einer
CheckboxColumn sowohl von einem Mausklick als auch
vom Drücken der Leertaste ausgelöst wird.

Der neue Wert ist dann aber weder in
dgv.Rows[rowIndex].Cells[columnIndex].Value;
noch in:
//dataTable ist die DataSource des DGV
dataTable.Rows[rowIndex][columnIndex];
abrufbar, weil der Edit in diesem Moment ja noch
nicht fertig ist.



Du musst DGV.CurrentCell.EditedFormattedValue
abfragen.

Gibt es ein Event, das mir beide Werte (den der der
gerade dabei ist, gesetzt zu werden und den alten)
liefert?



Den neuen Wert bekommst Du in

DGV_CellContentclick
mit
DGV.CurrentCell.EditedFormattedValue

Den alten Wert kannst Du Dir in DGV.CellMouseDown und
in DGV.CellKeyDown holen.

Hier ein kleines Beispiel (VB.net):

' /// Code in einem leeren Formmodul (Form1.vb)
Public Class Form1
Private WithEvents DGV As DataGridView
Private mDT As DataTable
Private WithEvents mDV As DataView
Private WithEvents mCB As CheckBox

Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow

mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Text", GetType(String))
.Columns.Add("Bool", GetType(Boolean))

For i = 1 To 12
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = MonthName(i, False)
DR.Item(2) = ((i Mod 2) = 0)
.Rows.Add(DR)
Next
.AcceptChanges()
End With

mDV = New DataView(mDT)
End Sub


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

DGV = New DataGridView
With DGV
.SetBounds _
(10, 10, _
Me.ClientSize.Width - 20, _
Me.ClientSize.Height - 20)

.Anchor = _
AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right Or _
AnchorStyles.Bottom

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

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

End With
Me.Controls.Add(DGV)

CreateData()

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


Private Sub DGV_CellContentClick _
(ByVal sender As Object, _
ByVal e As DataGridViewCellEventArgs _
) Handles DGV.CellContentClick

If e.ColumnIndex = 2 Then
Beep()

Me.Text = _
"New Value: " & _
DGV.CurrentCell.EditedFormattedValue.ToString
End If

End Sub


Private Sub DGV_CellMouseDown _
(ByVal sender As Object, _
ByVal e As DataGridViewCellMouseEventArgs _
) Handles DGV.CellMouseDown

If e.Button = _
Windows.Forms.MouseButtons.Left Then

ShowOldValue()
End If
End Sub


Private Sub DGV_KeyDown _
(ByVal sender As Object, _
ByVal e As KeyEventArgs _
) Handles DGV.KeyDown

If e.KeyValue = 32 Then
ShowOldValue()
End If
End Sub


Private Sub ShowOldValue()
If DGV.CurrentCell.ColumnIndex = 2 Then
Console.WriteLine _
("Old Value: " & _
DGV.CurrentCell.EditedFormattedValue.ToString)
End If
End Sub
End Class
' \\\ E N T E

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

Ähnliche fragen