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 controltxtTransfer_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
CslaImports
MIST.CommonPublic
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 = ChartFieldOverrideApplyAuthorizationRules()
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.CurrentPrincipalChangedApplyAuthorizationRules()
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 ThenGoToPage(2)
' rebind UI and set controls_ChartFieldOverride = ChartFieldOverride.GetChartFieldOverride(id)
Me.ChartFieldOverrideBindingSource.DataSource = _ChartFieldOverridebtnDelete.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 = _ChartFieldOverrideListApplyAuthorizationRules()
Catch ex As Csla.DataPortalExceptionMessageBox.Show(ex.BusinessException.ToString, _
"Error saving", MessageBoxButtons.OK, _MessageBoxIcon.Exclamation)
Catch ex As ExceptionMessageBox.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.EmptytxtTransfer_ID.Text =
String.EmptytxtPortfolio.Text =
String.EmptytxtBusiness_Unit.Text =
String.EmptytxtProduct.Text =
String.EmptytxtDept_Id.Text =
String.EmptytxtActivity_Code.Text =
String.EmptytxtOperating_Unit.Text =
String.EmptytxtComment.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.ClickSaveData()
GoToPage(1)
End Sub Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click Me.Close() End SubPrivate 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 RegionEnd
ClassI 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
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
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