Forum: VB.NET |
Thema:
Re: Event bei datagrid-zellen Änderung triggern |
Von:
Tobi Ulm (
20.06.2005 13:54) |
Hi Armin,
so müsste es gehen
Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Public Class Form1
Inherits System.Windows.Forms.Form
Private WithEvents dataGrid1 As System.Windows.Forms.DataGrid
Private label1 As System.Windows.Forms.Label
Private components As System.ComponentModel.Container = Nothing
Public Sub New()
'
' Required for Windows Form Designer support
'
InitializeComponent()
End Sub 'New
'
' TODO: Add any constructor code after InitializeComponent call
'
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub 'Dispose
#Region "Windows Form Designer generated code"
'/ <summary>
'/ Required method for Designer support - do not modify
'/ the contents of this method with the code editor.
'/ </summary>
Private Sub InitializeComponent()
Me.dataGrid1 = New System.Windows.Forms.DataGrid()
Me.label1 = New System.Windows.Forms.Label()
CType(Me.dataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
' dataGrid1
'
Me.dataGrid1.Anchor = System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left Or System.Windows.Forms.AnchorStyles.Right
Me.dataGrid1.DataMember = ""
Me.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText
Me.dataGrid1.Location = New System.Drawing.Point(40, 24)
Me.dataGrid1.Name = "dataGrid1"
Me.dataGrid1.Size = New System.Drawing.Size(360, 224)
Me.dataGrid1.TabIndex = 0
'
' label1
'
Me.label1.Anchor = System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left Or System.Windows.Forms.AnchorStyles.Right
Me.label1.Location = New System.Drawing.Point(112, 264)
Me.label1.Name = "label1"
Me.label1.Size = New System.Drawing.Size(224, 23)
Me.label1.TabIndex = 1
'
' Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(440, 294)
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.label1, Me.dataGrid1})
Me.Name = "Form1"
Me.Text = "Form1"
CType(Me.dataGrid1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub 'InitializeComponent
#End Region
<STAThread()> _
Shared Sub Main()
Application.Run(New Form1())
End Sub 'Main
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
'add a DataGridTableStyle so GridColumnStyles will be generated...
Dim dgts As New DataGridTableStyle()
dgts.MappingName = "MyTable"
Me.dataGrid1.TableStyles.Add(dgts)
'set the datasource
Dim dt As DataTable = Me.GetTheTable()
Me.dataGrid1.DataSource = dt
'hook the handlers for each of the TextBoxes in the generated columnstyles
Dim i As Integer
For i = 0 To dt.Columns.Count - 1
Dim dgtbc As DataGridTextBoxColumn = dgts.GridColumnStyles(i)
If Not (dgtbc Is Nothing) Then
AddHandler dgtbc.TextBox.TextChanged, AddressOf dataGrid_TextChanged
End If
Next
End Sub 'Form1_Load
#Region "Cell Start Editing"
Private lastEditedRow As Integer = -1
Private lastEditedCol As Integer = -1
Private Sub dataGrid_TextChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim dgcc As DataGridCell = Me.dataGrid1.CurrentCell
Dim tb As TextBox = GetEmbeddedTextBox(dgcc.ColumnNumber)
If Not (tb Is Nothing) Then
Dim oldValue As String = Me.dataGrid1(dgcc).ToString()
Dim newValue As String = tb.Text
If newValue <> oldValue AndAlso (dgcc.RowNumber <> lastEditedRow OrElse dgcc.ColumnNumber <> lastEditedCol) Then
Dim s As String = String.Format("{0},{1} started editing", dgcc.RowNumber, dgcc.ColumnNumber)
Me.label1.Text = s
Console.WriteLine(s)
lastEditedRow = dgcc.RowNumber
lastEditedCol = dgcc.ColumnNumber
End If
End If
End Sub 'dataGrid_TextChanged
Private Sub dataGrid1_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dataGrid1.CurrentCellChanged
lastEditedRow = -1
lastEditedCol = -1
End Sub 'dataGrid1_CurrentCellChanged
Private Function GetEmbeddedTextBox(ByVal col As Integer) As TextBox
Dim tbc As DataGridTextBoxColumn = Me.dataGrid1.TableStyles("MyTable").GridColumnStyles(col)
If Not (tbc Is Nothing) AndAlso tbc.TextBox.Modified Then
Return tbc.TextBox
End If
Return Nothing
End Function 'GetEmbeddedTextBox
#End Region
#Region "Generate the DataTable"
Private Function GetTheTable() As DataTable
'create a datatable as the datasource
Dim dt As New DataTable("MyTable")
Dim nCols As Integer = 4
Dim nRows As Integer = 10
Dim i As Integer
For i = 0 To nCols - 1
dt.Columns.Add(New DataColumn(String.Format("Col{0}", i)))
Next i
For i = 0 To nRows
Dim dr As DataRow = dt.NewRow()
Dim j As Integer
For j = 0 To nCols - 1
dr(j) = String.Format("row{0} col{1}", i, j)
Next j
dt.Rows.Add(dr)
Next
Return dt
End Function 'GetTheTable
#End Region
End Class 'Form1
cu
Tobi
Antworten
Vorsicht bei der Eingabe: Die Zeichen ' oder -- sind nicht erlaubt!