Problem with tabbing thru' TextBoxes after NewData() and Rebinding.

Problem with tabbing thru' TextBoxes after NewData() and Rebinding.

Old forum URL: forums.lhotka.net/forums/t/5954.aspx


andrewrajcoomar posted on Monday, December 08, 2008

I am having an issue where my textboxes require that I tab twice to exit them if I entered a value. If no value, regular behaviour, once is good enough. This only happens when I am trying to add new data and have a new object. No problems with edits.

Really grateful for any help.

 

I have a form with two page tabs. Tab1 contains a grid that binds to a readonly collection. Tab2 is for new data and is bound to a businessbaseobject.

On Tab2 I have a "New" button. When the user clicks it, I have this in my click event:

 

Me.ChartFieldOverrideBindingSource.CancelEdit()

' get a new object

_ChartFieldOverride = ChartFieldOverride.NewChartFieldOverride()

' rebind UI

Me.ChartFieldOverrideBindingSource.DataSource = _ChartFieldOverride

' repaint UI (set all textbox.text to string.empty)

RefreshControls()

' put focus to first textbox control

txtTransfer_ID.Focus()

This code works, EXCEPT, for some reason, any textbox that I enter a value in REQUIRES A DOUBLE TAB.

 

========================== COMPLETE CODE LISTING =================================

Imports Csla

Imports MIST.Common

Public Class ucChartFieldOverride

Inherits WinPart

#Region "Variables"

Private WithEvents _ChartFieldOverrideList As ChartFieldOverrideList

Private WithEvents _ChartFieldOverride As ChartFieldOverride

#End Region

#Region "Properties"

Public ReadOnly Property ChartFieldOverrideList() As ChartFieldOverrideList

Get

Return _ChartFieldOverrideList

End Get

End Property

Public ReadOnly Property ChartFieldOverride() As ChartFieldOverride

Get

Return _ChartFieldOverride

End Get

End Property

#End Region

#Region "Constructor"

Public Sub New(ByVal chartFieldOverrideList As ChartFieldOverrideList)

InitializeComponent()

_ChartFieldOverrideList = chartFieldOverrideList

Me.ChartFieldOverrideListBindingSource.DataSource = New SortedBindingList(Of ChartFieldOverrideInfo)(chartFieldOverrideList)

_ChartFieldOverride = ChartFieldOverride.NewChartFieldOverride()

Me.ChartFieldOverrideBindingSource.DataSource = ChartFieldOverride

ApplyAuthorizationRules()

End Sub

#End Region

#Region " WinPart Code "

Protected Overrides Function GetIdValue() As Object

Return _ChartFieldOverrideList

End Function

Public Overrides Function ToString() As String

Return "ChartField Overrides Maintenance"

End Function

Private Sub ucChartField_CurrentPrincipalChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.CurrentPrincipalChanged

ApplyAuthorizationRules()

End Sub

#End Region

Private Sub ApplyAuthorizationRules()

End Sub

#Region "Form Events"

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

With Me.ChartFieldOverrideListDataGridView

.RowHeadersVisible = False

.SelectionMode = DataGridViewSelectionMode.FullRowSelect

.AllowUserToAddRows = False

.AllowUserToDeleteRows = False

.AllowUserToOrderColumns = True

End With

'BindingNavigatorAddNewItem.Enabled = True

'BindingNavigatorDeleteItem.Enabled = True

End Sub

Private Sub ChartFieldOverrideListDataGridView_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ChartFieldOverrideListDataGridView.DoubleClick

Dim oUtils As Utilities = New Utilities

Dim id As Integer = oUtils.GetRowID(Me.ChartFieldOverrideListDataGridView.CurrentRow, "Xfr_ChartField_Override_ID")

If id <> 0 Then

GoToPage(2)

' rebind UI and set controls

_ChartFieldOverride = ChartFieldOverride.GetChartFieldOverride(id)

Me.ChartFieldOverrideBindingSource.DataSource = _ChartFieldOverride

btnDelete.Enabled = True

End If

End Sub

#End Region

#Region "Private Methods"

Private Sub SaveData()

Using busy As New StatusBusy("Saving...")

' stop the flow of events

Me.ChartFieldOverrideListBindingSource.RaiseListChangedEvents = False

Me.ChartFieldOverrideBindingSource.RaiseListChangedEvents = False

Me.ChartFieldOverrideBindingSource.EndEdit()

' do the save

Try

Dim temp As ChartFieldOverride = _ChartFieldOverride.Clone

_ChartFieldOverride = temp.Save

' rebind the UI

_ChartFieldOverrideList = ChartFieldOverrideList.GetChartFieldOverrideList()

Me.ChartFieldOverrideListBindingSource.DataSource = _ChartFieldOverrideList

ApplyAuthorizationRules()

Catch ex As Csla.DataPortalException

MessageBox.Show(ex.BusinessException.ToString, _

"Error saving", MessageBoxButtons.OK, _

MessageBoxIcon.Exclamation)

Catch ex As Exception

MessageBox.Show(ex.ToString, _

"Error saving", MessageBoxButtons.OK, _

MessageBoxIcon.Exclamation)

Finally

Me.ChartFieldOverrideListBindingSource.RaiseListChangedEvents = True

Me.ChartFieldOverrideBindingSource.RaiseListChangedEvents = True

Me.ChartFieldOverrideListBindingSource.ResetBindings(False)

Me.ChartFieldOverrideBindingSource.ResetBindings(False)

End Try

End Using

End Sub

Private Sub GoToPage(ByVal pg As Integer)

If pg = 1 Then

Me.TabControl1.SelectedTab = TabPage1

Else

Me.TabControl1.SelectedTab = TabPage2

End If

End Sub

Private Sub RefreshControls()

Xfr_Chartfield_Override_IDLabel1.Text = String.Empty

txtTransfer_ID.Text = String.Empty

txtPortfolio.Text = String.Empty

txtBusiness_Unit.Text = String.Empty

txtProduct.Text = String.Empty

txtDept_Id.Text = String.Empty

txtActivity_Code.Text = String.Empty

txtOperating_Unit.Text = String.Empty

txtComment.Text = String.Empty

End Sub

Private Function ID(ByVal datarow As DataGridViewRow) As Integer

If datarow IsNot Nothing Then

For Each cell As DataGridViewCell In datarow.Cells

If cell.OwningColumn.Name() = "Xfr_Chartfield_Override_ID" Then

Return DirectCast(cell.Value, Integer)

Exit For

End If

Next

End If

End Function

#End Region

#Region "Button Events"

Private Sub btnNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNew.Click

Me.ChartFieldOverrideBindingSource.CancelEdit()

' get a new chartfieldoverride object

_ChartFieldOverride = ChartFieldOverride.NewChartFieldOverride()

' rebind UI

Me.ChartFieldOverrideBindingSource.DataSource = _ChartFieldOverride

' repaint UI (set all textbox.text to string.empty)

RefreshControls()

txtTransfer_ID.Focus()

btnDelete.Enabled = False

End Sub

Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click

SaveData()

GoToPage(1)

End Sub

Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click

Me.Close()

End Sub

 

Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click

Me.ChartFieldOverrideBindingSource.CancelEdit()

RefreshControls()

GoToPage(1)

End Sub

#End Region

End Class

sergeyb replied on Monday, December 08, 2008

I am guessing that an exception is thrown in the process of updating the value in your object somewhere.  Run with exceptions turned on in debugger to verify.

 

Sergey Barskiy

Principal Consultant

office: 678.405.0687 | mobile: 404.388.1899

cid:_2_0648EA840648E85C001BBCB886257279
Microsoft Worldwide Partner of the Year | Custom Development Solutions, Technical Innovation

 

From: andrewrajcoomar [mailto:cslanet@lhotka.net]
Sent: Monday, December 08, 2008 6:10 PM
To: Sergey Barskiy
Subject: [CSLA .NET] Problem with tabbing thru' TextBoxes after NewData() and Rebinding.

 

I am having an issue where my textboxes require that I tab twice to exit them if I entered a value. If no value, regular behaviour, once is good enough. This only happens when I am trying to add new data and have a new object. No problems with edits.

Really grateful for any help.

 

I have a form with two page tabs. Tab1 contains a grid that binds to a readonly collection. Tab2 is for new data and is bound to a businessbaseobject.

On Tab2 I have a "New" button. When the user clicks it, I have this in my click event:

 

Me.ChartFieldOverrideBindingSource.CancelEdit()

' get a new object

_ChartFieldOverride = ChartFieldOverride.NewChartFieldOverride()

' rebind UI

Me.ChartFieldOverrideBindingSource.DataSource = _ChartFieldOverride

' repaint UI (set all textbox.text to string.empty)

RefreshControls()

' put focus to first textbox control

txtTransfer_ID.Focus()

This code works, EXCEPT, for some reason, any textbox that I enter a value in REQUIRES A DOUBLE TAB.

 

========================== COMPLETE CODE LISTING =================================

Imports Csla

Imports MIST.Common

Public Class ucChartFieldOverride

Inherits WinPart

#Region "Variables"

Private WithEvents _ChartFieldOverrideList As ChartFieldOverrideList

Private WithEvents _ChartFieldOverride As ChartFieldOverride

#End Region

#Region "Properties"

Public ReadOnly Property ChartFieldOverrideList() As ChartFieldOverrideList

Get

Return _ChartFieldOverrideList

End Get

End Property

Public ReadOnly Property ChartFieldOverride() As ChartFieldOverride

Get

Return _ChartFieldOverride

End Get

End Property

#End Region

#Region "Constructor"

Public Sub New(ByVal chartFieldOverrideList As ChartFieldOverrideList)

InitializeComponent()

_ChartFieldOverrideList = chartFieldOverrideList

Me.ChartFieldOverrideListBindingSource.DataSource = New SortedBindingList(Of ChartFieldOverrideInfo)(chartFieldOverrideList)

_ChartFieldOverride = ChartFieldOverride.NewChartFieldOverride()

Me.ChartFieldOverrideBindingSource.DataSource = ChartFieldOverride

ApplyAuthorizationRules()

End Sub

#End Region

#Region " WinPart Code "

Protected Overrides Function GetIdValue() As Object

Return _ChartFieldOverrideList

End Function

Public Overrides Function ToString() As String

Return "ChartField Overrides Maintenance"

End Function

Private Sub ucChartField_CurrentPrincipalChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.CurrentPrincipalChanged

ApplyAuthorizationRules()

End Sub

#End Region

Private Sub ApplyAuthorizationRules()

End Sub

#Region "Form Events"

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

With Me.ChartFieldOverrideListDataGridView

.RowHeadersVisible = False

.SelectionMode = DataGridViewSelectionMode.FullRowSelect

.AllowUserToAddRows = False

.AllowUserToDeleteRows = False

.AllowUserToOrderColumns = True

End With

'BindingNavigatorAddNewItem.Enabled = True

'BindingNavigatorDeleteItem.Enabled = True

End Sub

Private Sub ChartFieldOverrideListDataGridView_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ChartFieldOverrideListDataGridView.DoubleClick

Dim oUtils As Utilities = New Utilities

Dim id As Integer = oUtils.GetRowID(Me.ChartFieldOverrideListDataGridView.CurrentRow, "Xfr_ChartField_Override_ID")

If id <> 0 Then

GoToPage(2)

' rebind UI and set controls

_ChartFieldOverride = ChartFieldOverride.GetChartFieldOverride(id)

Me.ChartFieldOverrideBindingSource.DataSource = _ChartFieldOverride

btnDelete.Enabled = True

End If

End Sub

#End Region

#Region "Private Methods"

Private Sub SaveData()

Using busy As New StatusBusy("Saving...")

' stop the flow of events

Me.ChartFieldOverrideListBindingSource.RaiseListChangedEvents = False

Me.ChartFieldOverrideBindingSource.RaiseListChangedEvents = False

Me.ChartFieldOverrideBindingSource.EndEdit()

' do the save

Try

Dim temp As ChartFieldOverride = _ChartFieldOverride.Clone

_ChartFieldOverride = temp.Save

' rebind the UI

_ChartFieldOverrideList = ChartFieldOverrideList.GetChartFieldOverrideList()

Me.ChartFieldOverrideListBindingSource.DataSource = _ChartFieldOverrideList

ApplyAuthorizationRules()

Catch ex As Csla.DataPortalException

MessageBox.Show(ex.BusinessException.ToString, _

"Error saving", MessageBoxButtons.OK, _

MessageBoxIcon.Exclamation)

Catch ex As Exception

MessageBox.Show(ex.ToString, _

"Error saving", MessageBoxButtons.OK, _

MessageBoxIcon.Exclamation)

Finally

Me.ChartFieldOverrideListBindingSource.RaiseListChangedEvents = True

Me.ChartFieldOverrideBindingSource.RaiseListChangedEvents = True

Me.ChartFieldOverrideListBindingSource.ResetBindings(False)

Me.ChartFieldOverrideBindingSource.ResetBindings(False)

End Try

End Using

End Sub

Private Sub GoToPage(ByVal pg As Integer)

If pg = 1 Then

Me.TabControl1.SelectedTab = TabPage1

Else

Me.TabControl1.SelectedTab = TabPage2

End If

End Sub

Private Sub RefreshControls()

Xfr_Chartfield_Override_IDLabel1.Text = String.Empty

txtTransfer_ID.Text = String.Empty

txtPortfolio.Text = String.Empty

txtBusiness_Unit.Text = String.Empty

txtProduct.Text = String.Empty

txtDept_Id.Text = String.Empty

txtActivity_Code.Text = String.Empty

txtOperating_Unit.Text = String.Empty

txtComment.Text = String.Empty

End Sub

Private Function ID(ByVal datarow As DataGridViewRow) As Integer

If datarow IsNot Nothing Then

For Each cell As DataGridViewCell In datarow.Cells

If cell.OwningColumn.Name() = "Xfr_Chartfield_Override_ID" Then

Return DirectCast(cell.Value, Integer)

Exit For

End If

Next

End If

End Function

#End Region

#Region "Button Events"

Private Sub btnNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNew.Click

Me.ChartFieldOverrideBindingSource.CancelEdit()

' get a new chartfieldoverride object

_ChartFieldOverride = ChartFieldOverride.NewChartFieldOverride()

' rebind UI

Me.ChartFieldOverrideBindingSource.DataSource = _ChartFieldOverride

' repaint UI (set all textbox.text to string.empty)

RefreshControls()

txtTransfer_ID.Focus()

btnDelete.Enabled = False

End Sub

Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click

SaveData()

GoToPage(1)

End Sub

Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click

Me.Close()

End Sub

 

Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click

Me.ChartFieldOverrideBindingSource.CancelEdit()

RefreshControls()

GoToPage(1)

End Sub

#End Region

End Class



andrewrajcoomar replied on Monday, December 08, 2008

I am running in Debug configuration. I have breakpoint in the form and in the object class. No code execution takes place when I am hitting tab. Don't even see the setter on the property, firing for propertyhaschanged.

By the way, I am on VS 2005 and CSLA.Net 2.1.4.0.

 

Copyright (c) Marimer LLC