Related
I want to use AutoSize of TableLayoutPanel and FlowLayoutPanel to layout my Controls. After the parent Control has been layed out I want to freeze the layout, so if I hide a control, nothing should collapse. So I want to use Control.Visible but without collapsing it.
Background information: I have a Control that supports multiple languages. I want the design to adjust to the language automatically. If I click a CheckBox then sometimes some Controls are hiding or showing, which causes the whole design to change if I use AutoSize. I don't want the Controls to collapse, I just want the Controls to show the background of the parent Control and keep the size.
Example (vb.net)
Form1.vb
Public Class Form1
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
Label1.Visible = CheckBox1.Checked
End Sub
End Class
Form1.Designer.vb
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
Inherits System.Windows.Forms.Form
'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Wird vom Windows Form-Designer benötigt.
Private components As System.ComponentModel.IContainer
'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel()
Me.Label1 = New System.Windows.Forms.Label()
Me.CheckBox1 = New System.Windows.Forms.CheckBox()
Me.TableLayoutPanel1.SuspendLayout()
Me.SuspendLayout()
'
'TableLayoutPanel1
'
Me.TableLayoutPanel1.AutoSize = True
Me.TableLayoutPanel1.ColumnCount = 1
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle())
Me.TableLayoutPanel1.Controls.Add(Me.Label1, 0, 0)
Me.TableLayoutPanel1.Controls.Add(Me.CheckBox1, 0, 1)
Me.TableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill
Me.TableLayoutPanel1.Location = New System.Drawing.Point(0, 0)
Me.TableLayoutPanel1.Name = "TableLayoutPanel1"
Me.TableLayoutPanel1.RowCount = 2
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle())
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle())
Me.TableLayoutPanel1.Size = New System.Drawing.Size(800, 450)
Me.TableLayoutPanel1.TabIndex = 0
'
'Label1
'
Me.Label1.AutoSize = True
Me.Label1.Location = New System.Drawing.Point(3, 0)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(39, 13)
Me.Label1.TabIndex = 0
Me.Label1.Text = "Label1"
'
'CheckBox1
'
Me.CheckBox1.AutoSize = True
Me.CheckBox1.Checked = True
Me.CheckBox1.CheckState = System.Windows.Forms.CheckState.Checked
Me.CheckBox1.Location = New System.Drawing.Point(3, 16)
Me.CheckBox1.Name = "CheckBox1"
Me.CheckBox1.Size = New System.Drawing.Size(81, 17)
Me.CheckBox1.TabIndex = 1
Me.CheckBox1.Text = "CheckBox1"
Me.CheckBox1.UseVisualStyleBackColor = True
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.AutoSize = True
Me.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
Me.ClientSize = New System.Drawing.Size(800, 450)
Me.Controls.Add(Me.TableLayoutPanel1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.TableLayoutPanel1.ResumeLayout(False)
Me.TableLayoutPanel1.PerformLayout()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents TableLayoutPanel1 As TableLayoutPanel
Friend WithEvents Label1 As Label
Friend WithEvents CheckBox1 As CheckBox
End Class
Result:
I want the controls to not move around. I want the controls to keep the size if the label is hidden. The label should not collapse but paint the background of the parent control instead.
The best solution that I am sort of happy with is to write my own custom Panel that implements the desired behavior and put the target control into that custom Panel. The trick is to add a normal Panel to my custom Panel that hides the target control if Visible is changed to false.
Solution in VB.NET
NoCollapsePanel.vb
Public Class NoCollapsePanel
Public Enum VisibleModeE
Collapse
KeepSize
End Enum
Public Property VisibleMode As VisibleModeE
Get
Return _VisibleMode
End Get
Set
If Value = VisibleMode Then Return
_VisibleMode = Value
RefreshVisibility()
End Set
End Property
Private Sub RefreshVisibility()
If _Visible Then Controls.Remove(hidePanel)
Select Case VisibleMode
Case VisibleModeE.Collapse
MyBase.Visible = _Visible
Case VisibleModeE.KeepSize
MyBase.Visible = True
If Not Visible Then
' this is doing the trick
hidePanel.Size = Size
Controls.Add(hidePanel)
hidePanel.BringToFront()
End If
End Select
End Sub
Public Shadows Event VisibleChanged As EventHandler
Private ReadOnly hidePanel As New Panel() With {.Margin = New Padding(0)}
Private _Visible As Boolean = True
Private _VisibleMode As VisibleModeE = VisibleModeE.KeepSize
Public Overloads Property Visible As Boolean
Get
Return _Visible
End Get
Set
If _Visible = Value Then Return
_Visible = Value
RefreshVisibility()
RaiseEvent VisibleChanged(Me, New EventArgs())
End Set
End Property
Protected Overrides Sub OnResize(eventargs As EventArgs)
MyBase.OnResize(eventargs)
hidePanel.Size = Size
End Sub
End Class
NoCollapsePanel.Designer.vb
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class NoCollapsePanel
Inherits System.Windows.Forms.Panel
'Das Steuerelement überschreibt den Löschvorgang zum Bereinigen der Komponentenliste.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Wird vom Steuerelement-Designer benötigt.
Private components As System.ComponentModel.IContainer
' Hinweis: Die folgende Prozedur ist für den Komponenten-Designer erforderlich.
' Sie kann mit dem Komponenten-Designer geändert werden. Das Bearbeiten mit
' dem Code-Editor ist nicht möglich.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
components = New System.ComponentModel.Container()
End Sub
End Class
Testing the Panel
Form1.vb
Public Class Form1
Public Sub New()
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
ComboBox1.DataSource = System.Enum.GetValues(GetType(NoCollapsePanel.VisibleModeE))
End Sub
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
NoCollapsePanel1.Visible = CheckBox1.Checked
End Sub
Private rnd As New Random
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
BackColor = Color.FromArgb(255, rnd.Next(255), rnd.Next(255), rnd.Next(255))
End Sub
Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox2.CheckedChanged
Label1.Text = If(CheckBox2.Checked, "some text", "some very very very very long text")
End Sub
Private Sub NoCollapsePanel1_VisibleChanged(sender As Object, e As EventArgs) Handles NoCollapsePanel1.VisibleChanged
TestVisibleChanged_Label.Text = DateTime.Now
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
NoCollapsePanel1.VisibleMode = ComboBox1.SelectedValue
End Sub
End Class
Form1.Designer.vb
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
Inherits System.Windows.Forms.Form
'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Wird vom Windows Form-Designer benötigt.
Private components As System.ComponentModel.IContainer
'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel()
Me.CheckBox1 = New System.Windows.Forms.CheckBox()
Me.Button1 = New System.Windows.Forms.Button()
Me.CheckBox2 = New System.Windows.Forms.CheckBox()
Me.TestVisibleChanged_Label = New System.Windows.Forms.Label()
Me.FlowLayoutPanel2 = New System.Windows.Forms.FlowLayoutPanel()
Me.ComboBox1 = New System.Windows.Forms.ComboBox()
Me.NoCollapsePanel1 = New WindowsApp4.NoCollapsePanel()
Me.FlowLayoutPanel1 = New System.Windows.Forms.FlowLayoutPanel()
Me.Label1 = New System.Windows.Forms.Label()
Me.TableLayoutPanel1.SuspendLayout()
Me.FlowLayoutPanel2.SuspendLayout()
Me.NoCollapsePanel1.SuspendLayout()
Me.FlowLayoutPanel1.SuspendLayout()
Me.SuspendLayout()
'
'TableLayoutPanel1
'
Me.TableLayoutPanel1.AutoSize = True
Me.TableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
Me.TableLayoutPanel1.ColumnCount = 1
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle())
Me.TableLayoutPanel1.Controls.Add(Me.NoCollapsePanel1, 0, 0)
Me.TableLayoutPanel1.Controls.Add(Me.CheckBox1, 0, 1)
Me.TableLayoutPanel1.Controls.Add(Me.Button1, 0, 2)
Me.TableLayoutPanel1.Controls.Add(Me.CheckBox2, 0, 3)
Me.TableLayoutPanel1.Controls.Add(Me.TestVisibleChanged_Label, 0, 4)
Me.TableLayoutPanel1.Controls.Add(Me.ComboBox1, 0, 5)
Me.TableLayoutPanel1.Location = New System.Drawing.Point(3, 3)
Me.TableLayoutPanel1.Name = "TableLayoutPanel1"
Me.TableLayoutPanel1.RowCount = 6
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle())
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle())
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle())
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle())
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle())
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle())
Me.TableLayoutPanel1.Size = New System.Drawing.Size(127, 134)
Me.TableLayoutPanel1.TabIndex = 1
'
'CheckBox1
'
Me.CheckBox1.AutoSize = True
Me.CheckBox1.Checked = True
Me.CheckBox1.CheckState = System.Windows.Forms.CheckState.Checked
Me.CheckBox1.Location = New System.Drawing.Point(3, 22)
Me.CheckBox1.Name = "CheckBox1"
Me.CheckBox1.Size = New System.Drawing.Size(83, 17)
Me.CheckBox1.TabIndex = 1
Me.CheckBox1.Text = "Show Panel"
Me.CheckBox1.UseVisualStyleBackColor = True
'
'Button1
'
Me.Button1.AutoSize = True
Me.Button1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
Me.Button1.Location = New System.Drawing.Point(3, 45)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(106, 23)
Me.Button1.TabIndex = 2
Me.Button1.Text = "Change BackColor"
Me.Button1.UseVisualStyleBackColor = True
'
'CheckBox2
'
Me.CheckBox2.AutoSize = True
Me.CheckBox2.Location = New System.Drawing.Point(3, 74)
Me.CheckBox2.Name = "CheckBox2"
Me.CheckBox2.Size = New System.Drawing.Size(92, 17)
Me.CheckBox2.TabIndex = 3
Me.CheckBox2.Text = "Change Label"
Me.CheckBox2.UseVisualStyleBackColor = True
'
'TestVisibleChanged_Label
'
Me.TestVisibleChanged_Label.AutoSize = True
Me.TestVisibleChanged_Label.Location = New System.Drawing.Point(3, 94)
Me.TestVisibleChanged_Label.Name = "TestVisibleChanged_Label"
Me.TestVisibleChanged_Label.Size = New System.Drawing.Size(88, 13)
Me.TestVisibleChanged_Label.TabIndex = 4
Me.TestVisibleChanged_Label.Text = "Visibility changed"
'
'FlowLayoutPanel2
'
Me.FlowLayoutPanel2.AutoSize = True
Me.FlowLayoutPanel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
Me.FlowLayoutPanel2.Controls.Add(Me.TableLayoutPanel1)
Me.FlowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill
Me.FlowLayoutPanel2.Location = New System.Drawing.Point(0, 0)
Me.FlowLayoutPanel2.Name = "FlowLayoutPanel2"
Me.FlowLayoutPanel2.Size = New System.Drawing.Size(800, 450)
Me.FlowLayoutPanel2.TabIndex = 2
'
'ComboBox1
'
Me.ComboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.ComboBox1.FormattingEnabled = True
Me.ComboBox1.Location = New System.Drawing.Point(3, 110)
Me.ComboBox1.Name = "ComboBox1"
Me.ComboBox1.Size = New System.Drawing.Size(121, 21)
Me.ComboBox1.TabIndex = 5
'
'NoCollapsePanel1
'
Me.NoCollapsePanel1.AutoSize = True
Me.NoCollapsePanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
Me.NoCollapsePanel1.Controls.Add(Me.FlowLayoutPanel1)
Me.NoCollapsePanel1.Location = New System.Drawing.Point(3, 3)
Me.NoCollapsePanel1.Name = "NoCollapsePanel1"
Me.NoCollapsePanel1.Size = New System.Drawing.Size(45, 13)
Me.NoCollapsePanel1.TabIndex = 0
Me.NoCollapsePanel1.VisibleMode = WindowsApp4.NoCollapsePanel.VisibleModeE.KeepSize
'
'FlowLayoutPanel1
'
Me.FlowLayoutPanel1.AutoSize = True
Me.FlowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
Me.FlowLayoutPanel1.Controls.Add(Me.Label1)
Me.FlowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill
Me.FlowLayoutPanel1.Location = New System.Drawing.Point(0, 0)
Me.FlowLayoutPanel1.Name = "FlowLayoutPanel1"
Me.FlowLayoutPanel1.Size = New System.Drawing.Size(45, 13)
Me.FlowLayoutPanel1.TabIndex = 1
'
'Label1
'
Me.Label1.AutoSize = True
Me.Label1.Location = New System.Drawing.Point(3, 0)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(39, 13)
Me.Label1.TabIndex = 0
Me.Label1.Text = "Label1"
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.AutoSize = True
Me.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
Me.ClientSize = New System.Drawing.Size(800, 450)
Me.Controls.Add(Me.FlowLayoutPanel2)
Me.Name = "Form1"
Me.Text = "Form1"
Me.TableLayoutPanel1.ResumeLayout(False)
Me.TableLayoutPanel1.PerformLayout()
Me.FlowLayoutPanel2.ResumeLayout(False)
Me.FlowLayoutPanel2.PerformLayout()
Me.NoCollapsePanel1.ResumeLayout(False)
Me.NoCollapsePanel1.PerformLayout()
Me.FlowLayoutPanel1.ResumeLayout(False)
Me.FlowLayoutPanel1.PerformLayout()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents NoCollapsePanel1 As NoCollapsePanel
Friend WithEvents Label1 As Label
Friend WithEvents FlowLayoutPanel1 As FlowLayoutPanel
Friend WithEvents TableLayoutPanel1 As TableLayoutPanel
Friend WithEvents CheckBox1 As CheckBox
Friend WithEvents FlowLayoutPanel2 As FlowLayoutPanel
Friend WithEvents Button1 As Button
Friend WithEvents CheckBox2 As CheckBox
Friend WithEvents TestVisibleChanged_Label As Label
Friend WithEvents ComboBox1 As ComboBox
End Class
We use ToggleEdit (to enable/disable controls) when navigating to a new page in a new tab. This time the new tab is created in an existing page. It works as it should the first time the grid is loaded, but then fails the second time. Have tried lots of different methods but still the same result
Double clicking a row in a DataGrid causes a new tab to be opened
Private Sub Alarm_Edit(sender As Object, e As RoutedEventArgs)
Try
e.Handled = True
IsNewRecord = False
Dim DGV As DGVx = PersonalSchedule_Grid.FindName("Schedule_AlarmsDGV")
If DGV.SelectedItems.Count = 1 Then
Dim row As System.Data.DataRowView = DGV.SelectedItems(0)
Alarm_ID = row("ID")
Dim vName As String = row("Subject")
Dim vTab As STC_Tabx = PersonalSchedule_Grid.FindName(TabName)
Dim TabControl As STCx = PersonalSchedule_Grid.FindName("Alarm_TabControl")
If Not vTab Is Nothing Then
vTab.Close()
End If
Dim MCFrame As New Frame
Dim MCTab As New STC_Tabx
With MCTab
.Name = TabName
.Header = " " & Left(vName, 20) & " "
.ImageSource = ReturnImageAsString("Edit.png", 16)
.CloseButtonVisibility = DevComponents.WpfEditors.eTabCloseButtonVisibility.Visible
.TabToolTip = "View or edit the " & vName & " record"
' .Content = MCFrame
.Content = AlarmGrid()
End With
RemoveHandler MCTab.Closing, AddressOf TabControl_TabClosing
AddHandler MCTab.Closing, AddressOf TabControl_TabClosing
RegisterControl(PersonalSchedule_Grid, MCTab)
TabControl.Items.Add(MCTab)
' MCFrame.NavigationService.Navigate(AlarmPage)
LoadedTabs(TabName)
MCTab.IsSelected = True
End If
Catch ex As Exception
EmailError(ex)
End Try
End Sub
... and this is added to the tab
Private Function AlarmGrid() As Grid
Try
Dim MainGrid As New Grid
MainGrid.Children.Clear()
Dim vGrid As New Grid
vGrid.ColumnDefinitions.Clear()
vGrid.RowDefinitions.Clear()
vGrid.Children.Clear()
Dim SV As New ScrollViewer
With SV
.Name = "Alarm_SV"
.Content = vGrid
.VerticalScrollBarVisibility = ScrollBarVisibility.Auto
End With '
RegisterControl(PersonalSchedule_Grid, SV)
MainGrid.Children.Add(SV)
For i As Integer = 0 To 5
Dim vRow As New RowDefinition
If i = 4 Then
vRow.Height = New GridLength(35, GridUnitType.Star)
Else
vRow.Height = New GridLength(35)
End If
vGrid.RowDefinitions.Add(vRow)
Next
For i As Integer = 0 To 1
Dim vCol As New ColumnDefinition
If i = 0 Then
vCol.Width = New GridLength(120)
ElseIf i = 1 Then
vCol.Width = New GridLength(200, GridUnitType.Star)
End If
vGrid.ColumnDefinitions.Add(vCol)
Next
'Date | Time | Subject | Details
Dim vToolBar As New ToolBar
Grid.SetColumn(vToolBar, 0)
Grid.SetColumnSpan(vToolBar, 2)
Grid.SetRow(vToolBar, 0)
vGrid.Children.Add(vToolBar)
Dim EditButton As New Button
With EditButton
.Content = ReturnToolBarImage("Edit.png")
.Name = "Alarm_EditButton"
.ToolTip = "Edit the record"
If IsNewRecord = True Then
.Visibility = Visibility.Collapsed
End If
End With
RegisterControl(PersonalSchedule_Grid, EditButton)
vToolBar.Items.Add(EditButton)
Dim EditTS As New Separator
With EditTS
.Name = "Alarm_EditTS"
If IsNewRecord = True Then
.Visibility = Visibility.Collapsed
End If
End With
RegisterControl(PersonalSchedule_Grid, EditTS)
vToolBar.Items.Add(EditTS)
Dim SaveUpdateButton As New Button
With SaveUpdateButton
.Name = "Alarm_SaveUpdateButton"
If IsNewRecord = True Then
.Content = ReturnToolBarImage("Record_Insert.png")
.ToolTip = "Save the record"
.IsEnabled = True
Else
.Content = ReturnToolBarImage("Record_Update.png")
.ToolTip = "Update the record"
.IsEnabled = False
End If
End With
RegisterControl(PersonalSchedule_Grid, SaveUpdateButton)
vToolBar.Items.Add(SaveUpdateButton)
vToolBar.Items.Add(TS_Separator)
Dim EnabledCB As New CBx
With EnabledCB
.Content = "Enabled"
.ToolTip = "The alarm is enabled"
.Name = "Alarm_EnabledCB"
.IsNewRecord = IsNewRecord
If IsNewRecord = True Then
.Visibility = Visibility.Collapsed
End If
End With
RegisterControl(PersonalSchedule_Grid, EnabledCB)
vToolBar.Items.Add(EnabledCB)
If IsNewRecord = False Then
vToolBar.Items.Add(TS_Separator)
End If
Dim DateLB As New TextLabel
With DateLB
.Text = "Date"
End With
Grid.SetColumn(DateLB, 0)
Grid.SetRow(DateLB, 1)
vGrid.Children.Add(DateLB)
Dim DateTB As New DateTBx
With DateTB
.IsNewRecord = IsNewRecord
.Value = Today
.Name = "Alarm_DateTB"
End With
RegisterControl(PersonalSchedule_Grid, DateTB)
Grid.SetColumn(DateTB, 1)
Grid.SetRow(DateTB, 1)
vGrid.Children.Add(DateTB)
Dim TimeLB As New TextLabel
With TimeLB
.Text = "Time"
End With
Grid.SetColumn(TimeLB, 0)
Grid.SetRow(TimeLB, 2)
vGrid.Children.Add(TimeLB)
Dim TimeTB As New TimeTBx
With TimeTB
.Value = Format(DateTime.Now, "HH:mm")
.IsNewRecord = IsNewRecord
.Name = "Alarm_TimeTB"
End With
RegisterControl(PersonalSchedule_Grid, TimeTB)
Grid.SetColumn(TimeTB, 1)
Grid.SetRow(TimeTB, 2)
vGrid.Children.Add(TimeTB)
Dim SubjectLB As New TextLabel
With SubjectLB
.Text = "Subject"
End With
Grid.SetColumn(SubjectLB, 0)
Grid.SetRow(SubjectLB, 3)
vGrid.Children.Add(SubjectLB)
Dim SubjectTB As New TBx
With SubjectTB
.Width = 300
.IsNewRecord = IsNewRecord
.Name = "Alarm_SubjectTB"
End With
RegisterControl(PersonalSchedule_Grid, SubjectTB)
Grid.SetColumn(SubjectTB, 1)
Grid.SetRow(SubjectTB, 3)
vGrid.Children.Add(SubjectTB)
Dim DetailsLB As New TextBlock
With DetailsLB
.Text = "Details"
.VerticalAlignment = VerticalAlignment.Top
.HorizontalAlignment = Windows.HorizontalAlignment.Left
.Margin = New Thickness(10, 10, 0, 0)
End With
Grid.SetColumn(DetailsLB, 0)
Grid.SetRow(DetailsLB, 4)
vGrid.Children.Add(DetailsLB)
Dim DetailsTB As New MultiLineLargeTBx
With DetailsTB
.Name = "Alarm_DetailsTB"
.IsNewRecord = IsNewRecord
End With
RegisterControl(PersonalSchedule_Grid, DetailsTB)
Grid.SetColumn(DetailsTB, 1)
Grid.SetRow(DetailsTB, 4)
vGrid.Children.Add(DetailsTB)
If IsNewRecord = False Then
Dim vTime As TimeSpan = Nothing
Dim vDate As Date = Nothing
Dim vSubject As String = ""
Dim vDetails As String = ""
Dim IsAlarmSet As Boolean = False
Using vService As New Service1Client
strSQL = "Select Alarm_Date, Alarm_Time, Alarm_Subject, Alarm_Content, Alarm_Set FROM Alarm_Info WHERE Alarm_ID = " & Alarm_ID
Using DS As DataSet = vService.ReturnDataSetHAS(strSQL)
For Each Row As DataRow In DS.Tables(0).Rows
vTime = Row("Alarm_Time")
vDate = LocalDateFormat(Row("Alarm_Date"))
vSubject = ReturnText(Row("Alarm_Subject"))
vDetails = ReturnText(Row("Alarm_Content"))
Dim AlarmSet As Integer = Row("Alarm_Set")
If AlarmSet = 1 Then
IsAlarmSet = True
End If
Next
End Using
End Using
Dim TimeString As String = ReturnFormattedTime(vTime, False, True)
TimeTB.Value = TimeString
DateTB.Value = vDate
SubjectTB.Text = vSubject
DetailsTB.Text = vSubject
EnabledCB.IsChecked = IsAlarmSet
RemoveHandler EditButton.Click, AddressOf ToggleEdit_Click
RemoveHandler SV.MouseDoubleClick, AddressOf ToggleEdit_Click
RemoveHandler SaveUpdateButton.Click, AddressOf DB_Update
AddHandler EditButton.Click, AddressOf ToggleEdit_Click
AddHandler SV.MouseDoubleClick, AddressOf ToggleEdit_Click
AddHandler SaveUpdateButton.Click, AddressOf DB_Update
Else
RemoveHandler SaveUpdateButton.Click, AddressOf DB_Insert
AddHandler SaveUpdateButton.Click, AddressOf DB_Insert
End If
Return MainGrid
Catch ex As Exception
EmailError(ex)
Return Nothing
End Try
End Function
...and clicking the edit button or double clicking the ScrollViewer causes this to run
Private Sub ToggleEdit_Click(sender As Object, e As RoutedEventArgs)
Try
ToggleEdit()
Catch ex As Exception
EmailError(ex)
End Try
End Sub
Private Sub ToggleEdit()
Try
Dim SV As ScrollViewer = PersonalSchedule_Grid.FindName("Alarm_SV")
Dim DateTB As DateTBx = PersonalSchedule_Grid.FindName("Alarm_DateTB")
Dim TimeTB As TimeTBx = PersonalSchedule_Grid.FindName("Alarm_TimeTB")
Dim SubjectTB As TBx = PersonalSchedule_Grid.FindName("Alarm_SubjectTB")
Dim DetailsTB As MultiLineLargeTBx = PersonalSchedule_Grid.FindName("Alarm_DetailsTB")
Dim EnabledCB As CBx = PersonalSchedule_Grid.FindName("Alarm_EnabledCB")
Dim UpdateButton As Button = PersonalSchedule_Grid.FindName("Alarm_SaveUpdateButton")
If UpdateButton.IsEnabled = False Then
UpdateButton.IsEnabled = True
DateTB.IsNewRecord = True
TimeTB.IsNewRecord = True
SubjectTB.IsNewRecord = True
DetailsTB.IsNewRecord = True
EnabledCB.IsNewRecord = True
Else
UpdateButton.IsEnabled = False
DateTB.IsNewRecord = False
TimeTB.IsNewRecord = False
SubjectTB.IsNewRecord = False
DetailsTB.IsNewRecord = False
EnabledCB.IsNewRecord = False
End If
Catch ex As Exception
EmailError(ex)
End Try
End Sub
That should change the update button .IsEnabled to true (and the other controls .IsReadOnly) and back to false if clicked again.
It must be something very basic about WPF that I have missed for years, but running through the code in debug everything is firing as it should - it's changing the value of the control but it's not reflecting in the UI. Tried UpdateLayout and a host of other possible solutions, but...
Any pointers would be really helpful
Thanks
I'm trying to create a master-detail form with datagridviews all in code. The SELECT/fill part is working fine, but I am having trouble with UPDATE/INSERT/DELETE (which should happen automatically when the form is closed). The following code gives the error:
Update requires the UpdateCommand to have a connection object. The
Connection property of the UpdateCommand has not been initialized.
on the .Update line.
I tried moving the connection out of the GetData() procedure, but that was not the answer.
What should I be doing?
Code:
Imports System.Data
Imports System.Data.OleDb
Public Class TestMe2
Private lblSelector As New Label
Private cbSelector As New ComboBox
Private bsSelector As New BindingSource
Private daMaster As New OleDbDataAdapter
Private dgMaster As New DataGrid
Private bsMaster As New BindingSource
Private dgLookup As New DataGrid
Private bsLookups As New BindingSource
Private dsGFF As New DataSet
Private cnn As New OleDbConnection
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Me.Controls.Add(lblSelector)
lblSelector.Location = New System.Drawing.Point(0, 0)
lblSelector.Text = "FileType"
Me.Controls.Add(cbSelector)
cbSelector.Location = New System.Drawing.Point(Me.lblSelector.Width, 0)
Me.Controls.Add(dgMaster)
dgMaster.Location = New System.Drawing.Point(0, cbSelector.Height)
dgMaster.Height = 300
dgMaster.Width = 2000
Me.Controls.Add(dgLookup)
dgLookup.Location = New System.Drawing.Point(0, cbSelector.Height + dgMaster.Height)
dgLookup.Height = 100
dgLookup.Width = 1000
End Sub
Private Sub TestMe2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
bsSelector.DataSource = dsGFF
cbSelector.DataSource = bsSelector
bsMaster.DataSource = dsGFF
dgMaster.DataSource = bsMaster
bsLookups.DataSource = dsGFF
dgLookup.DataSource = bsLookups
GetData()
bsMaster.DataSource = bsSelector
bsMaster.DataMember = "FileTypesToGFFTranslator"
bsLookups.DataSource = bsMaster
bsLookups.DataMember = "GFFTranslatorToTranslations"
'dgMaster.autoresizecolumns()
End Sub
Private Sub GetData()
Dim command As New OleDbCommand
Dim parameter As New OleDbParameter
' where's the data?
Dim cnnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\GFFTranslator.accdb"
cnn = New OleDb.OleDbConnection(cnnString)
' set up up the selector
Dim daSelector As New OleDbDataAdapter("SELECT FileType FROM vwFileTypeSelection", cnn)
daSelector.Fill(dsGFF, "vwFileTypeSelection")
bsSelector.DataSource = dsGFF
bsSelector.DataMember = "vwFileTypeSelection"
cbSelector.ValueMember = "FileType"
cbSelector.DisplayMember = "FileType"
daSelector.Fill(dsGFF)
' set up the master
daMaster = New OleDbDataAdapter("SELECT * FROM GFFTranslator", cnn)
daMaster.Fill(dsGFF, "GFFTranslator")
daMaster.UpdateCommand = New OleDbCommand("UPDATE GFFTRanslator" & _
" SET FileType = ?" & _
" , FieldPosition = ?" & _
" , FieldType = ?" & _
" , StartRepeatingSection = ?" & _
" , FileTypeIdentifier = ?" & _
" , Flag = ?" & _
" , DataStart = ?" & _
" , DataLength = ?" & _
" , NextLine = ?" & _
" , Lookup = ?" & _
" , Title = ?" & _
" , ExtraInfo = ?" & _
" WHERE FileType = ?" & _
" AND FieldPosition = ? ;")
daMaster.UpdateCommand.Parameters.Add("#FileType", OleDbType.VarChar, 255, "FileType")
daMaster.UpdateCommand.Parameters.Add("#FieldPosition", OleDbType.Integer, 4, "FieldPosition")
daMaster.UpdateCommand.Parameters.Add("#FieldType", OleDbType.VarChar, 255, "FieldType")
daMaster.UpdateCommand.Parameters.Add("#StartRepeatingSection", OleDbType.Boolean, 1, "StartRepeatingSection")
daMaster.UpdateCommand.Parameters.Add("#FileTypeIdentifier", OleDbType.Boolean, 1, "FileTypeIdentifier")
daMaster.UpdateCommand.Parameters.Add("#Flag", OleDbType.Boolean, 1, "Flag")
daMaster.UpdateCommand.Parameters.Add("#DataStart", OleDbType.Integer, 5, "DataStart")
daMaster.UpdateCommand.Parameters.Add("#DataLength", OleDbType.Integer, 5, "DataLength")
daMaster.UpdateCommand.Parameters.Add("#NextLine", OleDbType.Boolean, 1, "NextLine")
daMaster.UpdateCommand.Parameters.Add("#Lookup", OleDbType.Boolean, 1, "Lookup")
daMaster.UpdateCommand.Parameters.Add("#Title", OleDbType.VarChar, 255, "Title")
daMaster.UpdateCommand.Parameters.Add("#ExtraInfo", OleDbType.VarChar, 255, "ExtraInfo")
' set up the lookup
Dim daLookup As New OleDbDataAdapter("SELECT * FROM Translations", cnn)
daLookup.Fill(dsGFF, "Translations")
' link everything together
Try
Dim drMaster As New DataRelation("FileTypesToGFFTranslator" _
, dsGFF.Tables("vwFileTypeSelection").Columns("FileType") _
, dsGFF.Tables("GFFTranslator").Columns("FileType"))
dsGFF.Relations.Add(drMaster)
Dim dcMaster As DataColumn() = New DataColumn() {dsGFF.Tables("GFFTranslator").Columns("FileType"), dsGFF.Tables("GFFTranslator").Columns("FieldType")}
Dim dcLookup As DataColumn() = New DataColumn() {dsGFF.Tables("Translations").Columns("FileType"), dsGFF.Tables("Translations").Columns("FieldType")}
Dim drLookup As New DataRelation("GFFTranslatorToTranslations" _
, dcMaster _
, dcLookup)
dsGFF.Relations.Add(drLookup)
Catch ex As Exception
MessageBox.Show("Error: " & ex.Message)
End Try
End Sub
Protected Overrides Sub Finalize()
Me.Validate()
Me.daMaster.Update(dsGFF.Tables("GFFTranslator"))
Me.dsGFF.AcceptChanges()
MyBase.Finalize()
End Sub
End Class
In the code below, you are passing a connection object to your SELECT command.
' set up the master
daMaster = New OleDbDataAdapter("SELECT * FROM GFFTranslator", cnn)
Once the .Fill() method is done, your connection object is closed.
daMaster.Fill(dsGFF, "GFFTranslator")
You are now trying to create an UPDATE command but you aren't passing it a connection object for it to work with.
daMaster.UpdateCommand = New OleDbCommand("UPDATE GFFTRanslator" & _
" SET FileType = ?" & _
" , FieldPosition = ?" & _
" , FieldType = ?" & _
" , StartRepeatingSection = ?" & _
" , FileTypeIdentifier = ?" & _
" , Flag = ?" & _
" , DataStart = ?" & _
" , DataLength = ?" & _
" , NextLine = ?" & _
" , Lookup = ?" & _
" , Title = ?" & _
" , ExtraInfo = ?" & _
" WHERE FileType = ?" & _
" AND FieldPosition = ? ;")
daMaster.UpdateCommand.Parameters.Add("#FileType", OleDbType.VarChar, 255, "FileType")
daMaster.UpdateCommand.Parameters.Add("#FieldPosition", OleDbType.Integer, 4, "FieldPosition")
daMaster.UpdateCommand.Parameters.Add("#FieldType", OleDbType.VarChar, 255, "FieldType")
daMaster.UpdateCommand.Parameters.Add("#StartRepeatingSection", OleDbType.Boolean, 1, "StartRepeatingSection")
daMaster.UpdateCommand.Parameters.Add("#FileTypeIdentifier", OleDbType.Boolean, 1, "FileTypeIdentifier")
daMaster.UpdateCommand.Parameters.Add("#Flag", OleDbType.Boolean, 1, "Flag")
daMaster.UpdateCommand.Parameters.Add("#DataStart", OleDbType.Integer, 5, "DataStart")
daMaster.UpdateCommand.Parameters.Add("#DataLength", OleDbType.Integer, 5, "DataLength")
daMaster.UpdateCommand.Parameters.Add("#NextLine", OleDbType.Boolean, 1, "NextLine")
daMaster.UpdateCommand.Parameters.Add("#Lookup", OleDbType.Boolean, 1, "Lookup")
daMaster.UpdateCommand.Parameters.Add("#Title", OleDbType.VarChar, 255, "Title")
daMaster.UpdateCommand.Parameters.Add("#ExtraInfo", OleDbType.VarChar, 255, "ExtraInfo")
So, to fix this, do the following:
" AND FieldPosition = ? ;", cnn) // Pass your connection object here.
I want to create a Crystal Report at runtime by selecting the fields for the report from the treeview. The treeview consists of table names and the column names as the child node. After selecting the column names from the treeview, a "Generate Report" button has to be clicked, which will display the Crystal Report of the selected fields. How can I do this?
Public Class Form1
Dim objRpt As CrystalReport1
Dim con As New SqlConnection
Private Function CreateSelectQueryAndParameters() As String
Dim reportDocument As New ReportDocument
Dim paramFields As New ParameterFields
Dim paramField As ParameterField
Dim paramDiscreteValue As ParameterDiscreteValue
Dim query As String = "SELECT "
Dim columnNo As Integer = 0
If CheckBox1.Checked Then
columnNo = columnNo + 1
query = query.Insert(query.Length, "pcode as Column" + columnNo.ToString())
paramField = New ParameterField()
paramField.Name = "col" + columnNo.ToString()
paramDiscreteValue = New ParameterDiscreteValue()
paramDiscreteValue.Value = "Property Code"
paramField.CurrentValues.Add(paramDiscreteValue)
paramFields.Add(paramField)
End If
If CheckBox2.Checked Then
columnNo = columnNo + 1
If (query.Contains("Column")) Then
query = query.Insert(query.Length, ", ")
End If
query = query.Insert(query.Length, "pname as Column" +
columnNo.ToString())
paramField = New ParameterField()
paramField.Name = "col" + columnNo.ToString()
paramDiscreteValue = New ParameterDiscreteValue()
paramDiscreteValue.Value = "Property Name"
paramField.CurrentValues.Add(paramDiscreteValue)
paramFields.Add(paramField)
End If
For i As Integer = columnNo To 2
columnNo = columnNo + 1
paramField = New ParameterField()
paramField.Name = "col" + columnNo.ToString()
paramDiscreteValue = New ParameterDiscreteValue()
paramDiscreteValue.Value = ""
paramField.CurrentValues.Add(paramDiscreteValue)
paramFields.Add(paramField)
Next
CrystalReportViewer1.ParameterFieldInfo = paramFields
query += " FROM propdb"
Return query
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
objRpt = New CrystalReport1()
con.ConnectionString = "Data Source=MY-PC; Initial Catalog=hrmdb; Integrated Security=True"
con.Open()
Dim query As String = CreateSelectQueryAndParameters()
If Not query.Contains("Column") Then
MessageBox.Show("No selection to display!")
Return
End If
Try
**' I DON'T KNOW WHAT CODE TO ADD HERE'**
CrystalReportViewer1.ReportSource = objRpt
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
con.Close()
End Sub
End Class
I had a similar program in C#, but they used Access in it and I am using SQL Server now:
public partial class Form1 : Form
{
CrystalReport1 objRpt;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
objRpt = new CrystalReport1();
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\db1.mdb";
//Get Select query Strring and add parameters to the
//Crystal report.
string query = CreateSelectQueryAndParameters();
//if there is no item select,then exit from the method.
if (!query.Contains("Column"))
{
MessageBox.Show("No selection to display!");
return;
}
try
{
OleDbConnection Conn = new OleDbConnection(connString);
OleDbDataAdapter adepter = new OleDbDataAdapter(query, connString);
DataSet1 Ds = new DataSet1();
adepter.Fill(Ds, "Customer");
objRpt.SetDataSource(Ds);
crystalReportViewer1.ReportSource = objRpt;
}
catch (OleDbException oleEx)
{
MessageBox.Show(oleEx.Message);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
}
}
/// <summary>
/// This method is used to
/// 1. create SELECT query according to the selected column names and
/// 2. create parameters and assign values for that parameter that correspond to
/// the crystal report.
/// NOTE: This parameter is used to display column names of the Crystal Report
/// according to the user selection.
/// </summary>
/// <returns></returns>
private string CreateSelectQueryAndParameters()
{
ReportDocument reportDocument;
ParameterFields paramFields;
ParameterField paramField;
ParameterDiscreteValue paramDiscreteValue;
reportDocument = new ReportDocument();
paramFields = new ParameterFields();
string query = "SELECT ";
int columnNo = 0;
if (chbCode.Checked)
{
columnNo++;
query = query.Insert(query.Length, "Code as Column" + columnNo.ToString());
paramField = new ParameterField();
paramField.Name = "col" + columnNo.ToString();
paramDiscreteValue = new ParameterDiscreteValue();
paramDiscreteValue.Value = "Customer Code";
paramField.CurrentValues.Add(paramDiscreteValue);
//Add the paramField to paramFields
paramFields.Add(paramField);
}
if (chbFirstName.Checked)
{
columnNo++;
if (query.Contains("Column"))
{
query = query.Insert(query.Length, ", ");
}
query = query.Insert(query.Length, "FirstName as Column" + columnNo.ToString());
paramField = new ParameterField();
paramField.Name = "col" + columnNo.ToString();
paramDiscreteValue = new ParameterDiscreteValue();
paramDiscreteValue.Value = "First Name";
paramField.CurrentValues.Add(paramDiscreteValue);
//Add the paramField to paramFields
paramFields.Add(paramField);
}
if (chbLastName.Checked)
{
columnNo++;
if (query.Contains("Column"))
{
query = query.Insert(query.Length, ", ");
}
query = query.Insert(query.Length, "LastName as Column" + columnNo.ToString());
paramField = new ParameterField();
paramField.Name = "col" + columnNo.ToString();
paramDiscreteValue = new ParameterDiscreteValue();
paramDiscreteValue.Value = "Last Name";
paramField.CurrentValues.Add(paramDiscreteValue);
// Add the paramField to paramFields
paramFields.Add(paramField);
}
if (chbAddress.Checked)
{
columnNo++;
if (query.Contains("Column"))
{
query = query.Insert(query.Length, ", ");
}
query = query.Insert(query.Length, "Address as Column" + columnNo.ToString());
paramField = new ParameterField();
paramField.Name = "col" + columnNo.ToString();
paramDiscreteValue = new ParameterDiscreteValue();
paramDiscreteValue.Value = "Address";
paramField.CurrentValues.Add(paramDiscreteValue);
//Add the paramField to paramFields
paramFields.Add(paramField);
}
if (chbPhone.Checked)
{
columnNo++;
if (query.Contains("Column"))
{
query = query.Insert(query.Length, ", ");
}
query = query.Insert(query.Length, "Phone as Column" + columnNo.ToString());
paramField = new ParameterField();
paramField.Name = "col" + columnNo.ToString();
paramDiscreteValue = new ParameterDiscreteValue();
paramDiscreteValue.Value = "Phone";
paramField.CurrentValues.Add(paramDiscreteValue);
// Add the paramField to paramFields
paramFields.Add(paramField);
}
//if there is any remaining parameter, assign empty value for that
//parameter.
for (int i = columnNo; i < 5; i++)
{
columnNo++;
paramField = new ParameterField();
paramField.Name = "col" + columnNo.ToString();
paramDiscreteValue = new ParameterDiscreteValue();
paramDiscreteValue.Value = "";
paramField.CurrentValues.Add(paramDiscreteValue);
//Add the paramField to paramFields
paramFields.Add(paramField);
}
crystalReportViewer1.ParameterFieldInfo = paramFields;
query += " FROM Customer" ;
return query;
}
}
How could I add a new table in my access database using vb.net code.
I am supposed to write a code that when i am going to add a new file it will be having its own table in my data base.
here is my code:
Public Class Form3
Dim con As New OleDb.OleDbConnection
Dim dbprovider As String
Dim dbsource As String
Dim ds As New DataSet
Dim da As New OleDb.OleDbDataAdapter
Dim sql As String
Dim inc As Integer
Dim intDB_ID_Selected As Integer
Dim ocmd As OleDb.OleDbCommand
Dim odatareader As OleDb.OleDbDataReader
Dim state As Integer
Dim rownumber As Integer
Dim intCurIndex As Integer
Private Sub Form3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
'TODO: This line of code loads data into the 'SofEngdbDataSet.DentalRecords' table. You can move, or remove it, as needed.
dbprovider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
dbsource = "Data Source = C:\Users\AllyzaJane\Desktop\Finals\SofEngdb.mdb"
con.ConnectionString = dbprovider & dbsource
con.Open()
sql = "SELECT * FROM DentalRecords"
da = New OleDb.OleDbDataAdapter(sql, con)
da.Fill(ds, "SofEngdb")
tb_fname.ReadOnly = True
tb_minitial.ReadOnly = True
tb_lname.ReadOnly = True
tb_add.ReadOnly = True
tb_num.ReadOnly = True
rtb_remarks.ReadOnly = True
tb_search.ReadOnly = False
b_add.Enabled = True
b_cancel.Enabled = True
b_save.Enabled = False
b_search.Enabled = True
b_delete.Enabled = False
b_update.Enabled = False
End Sub
Private Sub b_cancel_Click(sender As System.Object, e As System.EventArgs) Handles b_cancel.Click
b_save.Enabled = False
b_add.Enabled = True
b_update.Enabled = False
b_delete.Enabled = False
b_search.Enabled = True
MsgBox("Cancelled")
tb_search.ReadOnly = False
cleartextvalue()
End Sub
Private Function DentalRecordsTableAdapter() As Object
Throw New NotImplementedException
End Function
Private Function SampledDataSet() As Object
Throw New NotImplementedException
End Function
Private Sub b_update_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles b_update.Click
state = 0
tb_fname.ReadOnly = False
tb_fname.ReadOnly = False
tb_minitial.ReadOnly = False
tb_lname.ReadOnly = False
tb_num.ReadOnly = False
tb_add.ReadOnly = False
rtb_remarks.ReadOnly = False
tb_search.ReadOnly = True
b_add.Enabled = False
b_save.Enabled = True
b_cancel.Enabled = True
b_delete.Enabled = False
b_search.Enabled = False
b_update.Enabled = False
End Sub
Private Sub b_add_Click(sender As System.Object, e As System.EventArgs) Handles b_add.Click
state = 1
b_add.Enabled = False
b_search.Enabled = False
b_delete.Enabled = False
b_update.Enabled = False
b_save.Enabled = True
b_cancel.Enabled = True
tb_fname.ReadOnly = False
tb_minitial.ReadOnly = False
tb_lname.ReadOnly = False
tb_num.ReadOnly = False
tb_add.ReadOnly = False
rtb_remarks.ReadOnly = False
cleartextvalue()
End Sub
Private Sub b_save_Click(sender As System.Object, e As System.EventArgs) Handles b_save.Click
b_add.Enabled = True
b_save.Enabled = False
b_search.Enabled = True
' for ADD
If state = 1 Then
If tb_fname.Text = "" Or tb_minitial.Text = "" Or tb_lname.Text = "" Or tb_num.Text = "" Or tb_add.Text = "" Or rtb_remarks.Text = "" Then
MessageBox.Show("Fillup all the information needed.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Else
Try
con.Close()
con.Open()
sql = "INSERT INTO DentalRecords (fname,minitial,lname,cnumber,address,remarks) values ('" & tb_fname.Text & "','" & tb_minitial.Text & "','" & tb_lname.Text & "','" & tb_num.Text & "','" & tb_add.Text & "','" & rtb_remarks.Text & "')"
ocmd = New OleDb.OleDbCommand(sql, con)
odatareader = ocmd.ExecuteReader()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
MessageBox.Show("Succesfully added.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
cleartextvalue()
tb_search.ReadOnly = False
End If
Else
If tb_fname.Text = "" Or tb_minitial.Text = "" Or tb_lname.Text = "" Or tb_num.Text = "" Or tb_add.Text = "" Or rtb_remarks.Text = "" Then
MessageBox.Show("Fillup all the information needed.", "Personal Info", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Else
sql = "UPDATE DentalRecords set lname = '" & tb_lname.Text & "', minitial = '" & tb_minitial.Text & "', fname = '" & tb_fname.Text & "', address = '" & tb_add.Text & "', remarks = '" & rtb_remarks.Text & "' WHERE cnumber = '" & tb_num.Text & "'"
ocmd = New OleDb.OleDbCommand(sql, con)
odatareader = ocmd.ExecuteReader()
MessageBox.Show("Successfully updated.", "Personal Info", MessageBoxButtons.OK, MessageBoxIcon.Information)
cleartextvalue()
b_update.Enabled = False
b_save.Enabled = False
b_delete.Enabled = False
b_add.Enabled = True
b_search.Enabled = True
End If
con.Close()
End If
tb_search.ReadOnly = False
End Sub
Private Sub b_delete_Click(sender As System.Object, e As System.EventArgs) Handles b_delete.Click
Dim del As Integer
If tb_add.Text = "" Or tb_fname.Text = "" Or tb_minitial.Text = "" Or tb_lname.Text = "" Or tb_num.Text = "" Or tb_add.Text = "" Or rtb_remarks.Text = "" Then
MsgBox("No Info")
Else
Try
con.Close()
con.Open()
del = MessageBox.Show("Are you sure you want to delete this file?", "Information System", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If del = 6 Then
sql = "DELETE FROM DentalRecords WHERE fname = '" & tb_fname.Text & "' AND lname = '" & tb_lname.Text & "'AND minitial = '" & tb_minitial.Text & "'AND address = '" & tb_add.Text & "'AND cnumber = '" & tb_num.Text & "' AND remarks = '" & rtb_remarks.Text & "'"
ocmd = New OleDb.OleDbCommand(sql, con)
odatareader = ocmd.ExecuteReader()
MessageBox.Show("Data has been deleted", "Information System", MessageBoxButtons.OK, MessageBoxIcon.Information)
cleartextvalue()
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End If
End Sub
Sub cleartextvalue() ' for clearing the datas after doin an operation
tb_fname.Text = ""
tb_minitial.Text = ""
tb_lname.Text = ""
tb_add.Text = ""
tb_num.Text = ""
rtb_remarks.Text = ""
tb_search.Text = ""
End Sub
Private Sub b_search_Click(sender As System.Object, e As System.EventArgs) Handles b_search.Click
If tb_search.Text = "" Then
MsgBox("Not Found")
Else
con.Close()
con.Open()
sql = "SELECT * FROM DentalRecords WHERE fname LIKE '" & tb_search.Text & "'"
ocmd = New OleDb.OleDbCommand(sql, con)
odatareader = ocmd.ExecuteReader()
If odatareader.HasRows Then
Do While odatareader.Read
tb_fname.Text = odatareader.Item(1)
tb_minitial.Text = odatareader.Item(2)
tb_lname.Text = odatareader.Item(3)
tb_num.Text = odatareader.Item(5)
tb_add.Text = odatareader.Item(4)
rtb_remarks.Text = odatareader.Item(6)
Loop
tb_fname.ReadOnly = True
tb_minitial.ReadOnly = True
tb_lname.ReadOnly = True
tb_num.ReadOnly = True
tb_add.ReadOnly = True
tb_search.ReadOnly = False
rtb_remarks.ReadOnly = True
Else
MsgBox("Not Found")
End If
b_add.Enabled = True
b_delete.Enabled = True
b_cancel.Enabled = True
b_update.Enabled = True
End If
End Sub
End Class
i want to modify this in such way that creating a table in every new file added