How to customize a "MsgBox" control in Visual Basic - vb.net

Is there a way to customize the MsgBox control in Visual Basic?
I use it quite often to alert users. However it never pops up on the screen; it just appears along the bottom task bar. It also always has a heading similar to "App_data_xxx". Can I improve this in any way?
My searches aren't throwing up much help.
For example:
' Queries user number and password against the database and returns user
Dim matchingusers = From u In db.Users
Where username = u.Email And password = u.Password
Select u
' Checks if a valid user was returned
If matchingusers.Count = 0 Then
MsgBox("Invalid user entered, try again")
Else
SelectedDeveloper = 0
' Set the logged in user for use in the project
GlobalVariables.LoggedInUser = matchingusers.First

You can use the MessageBox function and its many variables. Here's an example of what it can do:
MessageBox.Show("The Displayed text in the messagebox", _
"the text displayed in the title bar", MessageBoxButtons.YesNoCancel, _
MessageBoxIcon.Error, MessageBoxDefaultButton.Button2)
Or you can still use MsgBox and use its variables, though it gives you fewer options. Here's an example:
MsgBox("message text", MsgBoxStyle.Information, "title bar text")

You are using a reference to the MessageBox class without specifying the Method you want to call. You cannot create an instance of MessageBox and therefore cannot pass a string as parameter to try and create one.
Use MessageBox.Show(string messageText) to display the MessageBox with the desired message.
As for your question, you should create your own MessageBox class. With this solution, you get all the options you want and can customize it completely. The call will be a little different :
//C#
var myCustomMessageBox = new CustomMessageBox();
myCustomMessageBox.ShowDialog();
//Vb
Dim myCustomMessageBox As New CustomMessageBox()
myCustomMessageBox.ShowDialog()
The ShowDialog() will be used to create the effect of a messagebox.

In Visual Basic 2008 I had a requirement for a message box that would only stay on for short times and that the time it was on to be variable. I also had the problem that when using extended screen that the msgbox showed up on the extended screen (which was a different form) instead of on the main computer screen. To overcome these problems I created a custom Message Box using a panel on the form I had on the main screen.
To call the message panel DoMessage("The message", Seconds, Buttons to show 1 = Ok only 2 = Yes(ok) and No, 3 = Yes, No and Cancel. If seconds is 0 or not specified then the time to show the panel is set to a long time (10000 seconds) If Buttons to show is not specified it is set to Ok button only. If seconds and buttons are both specified, If no button is clicked the panel will just hide after the timeout.
The responses are 1 if Ok or Yes is clicked, 2 if No is clicked, 3 if Cancel is clicked
It is put into DoMsgResp so you see what is in it to handle the response.
Create the message panel when opening the form by calling MakeMsgPanel()
Dim MessagePanel As New Panel 'The panel
Dim MessageLabel As New Label 'The message
Dim MsgYes As New Button 'Yes or OK button
Dim MsgNo As New Button 'no button
Dim MsgCcl As New Button 'Cancel button
Dim Sleepsecs As Integer 'How long panel shows for
Dim DoMsgResp As Integer 'response 1, 2 or 3 depending which button clicked
Private Sub MakeMsgPanel()
Me.Controls.Add(MessagePanel)
Me.MessagePanel.Controls.Add(MessageLabel)
Me.MessagePanel.Controls.Add(MsgYes)
Me.MessagePanel.Controls.Add(MsgNo)
Me.MessagePanel.Controls.Add(MsgCcl)
MessagePanel.Location = New System.Drawing.Point(Me.Width / 2 - 200, Me.Height / 2 - 100)
MessagePanel.BackColor = Color.PaleGreen
MessageLabel.BackColor = Color.PeachPuff
MessagePanel.BorderStyle = BorderStyle.FixedSingle
MessageLabel.Font = New Font("Arial", 12, FontStyle.Regular, GraphicsUnit.Point)
MessageLabel.AutoSize = True
MessagePanel.AutoSize = True
MessagePanel.AutoSizeMode = Windows.Forms.AutoSizeMode.GrowOnly
MessagePanel.Hide()
MsgYes.Location = New System.Drawing.Point(205, 5)
MsgNo.Location = New System.Drawing.Point(115, 5)
MsgCcl.Location = New System.Drawing.Point(25, 5)
MsgYes.Text = "Yes"
MsgNo.Text = "No"
MsgCcl.Text = "Cancel"
AddHandler MsgYes.Click, AddressOf MsgYes_Click
AddHandler MsgNo.Click, AddressOf MsgNo_Click
AddHandler MsgCcl.Click, AddressOf MsgCcl_Click
End Sub
Private Sub MsgYes_Click()
DoMsgResp = 1
Sleepsecs = 0
End Sub
Private Sub MsgNo_Click()
DoMsgResp = 2
Sleepsecs = 0
End Sub
Private Sub MsgCcl_Click()
DoMsgResp = 3
Sleepsecs = 0
End Sub
Private Sub DoMessage(ByVal Msg As String, Optional ByVal Secs As Integer = 0, _
Optional ByVal Btns As Integer = 0)
'Information messages that can be timed
Dim TheHeight As Integer
Dim TheWidth As Integer
Dim Labelx As Integer
Dim Labely As Integer
DoMsgResp = 0
MessageLabel.Text = Msg
If MessageLabel.Height < 90 Then
TheHeight = 100
Labely = (100 - MessageLabel.Height) / 2
Else
TheHeight = MessageLabel.Height + 10
Labely = 5
End If
If MessageLabel.Width < 140 Then
TheWidth = 150
Labelx = (150 - MessageLabel.Width) / 2
Else
TheWidth = MessageLabel.Width + 10
Labelx = 5
End If
MessagePanel.Size = New System.Drawing.Size(TheWidth, TheHeight)
MessageLabel.Location = New System.Drawing.Point(Labelx, Labely)
MessageLabel.Show()
MessagePanel.Show()
MessagePanel.BringToFront()
MsgYes.BringToFront()
MsgNo.BringToFront()
MsgCcl.BringToFront()
MessagePanel.Focus()
If Btns = 0 Or Btns > 3 Then Btns = 1 'Make ok button if none specified or number too high
If Btns = 1 Then
MsgYes.Text = "Ok"
MsgNo.Hide()
MsgCcl.Hide()
Else 'is 2 or 3
MsgYes.Text = "Yes"
MsgNo.Show()
If Btns = 2 Then MsgCcl.Hide() Else MsgCcl.Show()
End If
If Secs = 0 Then Secs = 10000 'make a long time
If Secs > 0 Then
Sleepsecs = Secs * 2
Do Until Sleepsecs < 1
Threading.Thread.Sleep(500)
Application.DoEvents()
Application.RaiseIdle(New System.EventArgs)
Sleepsecs = Sleepsecs - 1
Loop
End If
MessagePanel.Hide()
End Sub
Private Sub ButtonTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTest.Click
DoMessage("This is To see what happens with my message" & vbCrLf & _
"see if it works good", 0, 3)
If DoMsgResp = 1 Then
MsgBox("Ok was hit")
End If
If DoMsgResp = 2 Then
MsgBox("No was hit")
End If
If DoMsgResp = 3 Then
MsgBox("Cancel was hit")
End If
End Sub

Related

How do I get the programme to allow the user to change info if it is enterred incorrectly during a loop?

I am writing a programme that allows a user to enter personal details but each detail is limited by character length or something like that. I need it to allow the user to enter the details wrong 5 time before being cleared and sent back to a previous form. Im currently trying to use a loop for this but at the moment when you press the enter details button it just loops 5 times straight away and sends the user back without the user being able to change details and try again. Here is what I have so far.
Private Sub btnEnter_Click(sender As Object, e As EventArgs) Handles btnEnter.Click
'Declare variables
'This is the form that i will only allow the operator to enter 5 mistakes before being locked out
Dim strStreetAddress As String = txtStreetAddress.Text
Dim strTown As String = txtTown.Text
Dim strCounty As String = txtCounty.Text
Dim strEircode As String = txtEircode.Text
Dim mskPhoneNumber As String = mskNumber.Text
Dim intErrorCount As Integer = 0
'set up if statements
Do Until intErrorCount = 5
If strStreetAddress.Length = 0 Or strTown.Length = 0 Or strCounty.Length = 0 Or mskPhoneNumber.Length = 0 Or strEircode.Length = 0 Then
intErrorCount += 1
MessageBox.Show("One or more details have not been enterred")
txtStreetAddress.Clear()
txtCounty.Clear()
txtEircode.Clear()
txtTown.Clear()
mskNumber.Clear()
ElseIf strStreetAddress.Length > 50 Or strTown.Length > 15 Or strCounty.Length > 10 Or strEircode.Length <> 7 Or mskPhoneNumber.Length <> 10 Then
intErrorCount += 1
MessageBox.Show("One or more detais has been entered incorrectly")
txtStreetAddress.Clear()
txtCounty.Clear()
txtEircode.Clear()
txtTown.Clear()
mskNumber.Clear()
Else MessageBox.Show("All Details Entered Correctly")
Me.Hide()
frmPurchaseScreen.Show()
End If
Loop
'if errorcount reaches 5 then operator must login again and restart
If intErrorCount = 5 Then
MessageBox.Show("You have made too many errors, you must Login again")
Me.Hide()
frmLogin.Show()
End If
End Sub
Private Sub txtErrorCount_TextChanged(sender As Object, e As EventArgs) Handles txtErrorCount.TextChanged
End Sub
End Class
It's because you declare your error counter inside the sub and because the user can't change his input when you loop.
If you declare a variable in a sub, it will disappear as soon as the code exits the sub. To keep information outside of a sub, you need to declare the variable at a higher level.
Don't loop inside the sub called when the user click and remember the errors number with a higher level variable :
Private intErrorCount As Integer = 0
Private Sub btnEnter_Click(sender As Object, e As EventArgs) Handles Button1.Click
'Declare variables
'This is the form that i will only allow the operator to enter 5 mistakes before being locked out
Dim strStreetAddress As String = txtStreetAddress.Text
Dim strTown As String = txtTown.Text
Dim strCounty As String = txtCounty.Text
Dim strEircode As String = txtEircode.Text
Dim mskPhoneNumber As String = mskNumber.Text
If strStreetAddress.Length = 0 Or strTown.Length = 0 Or strCounty.Length = 0 Or mskPhoneNumber.Length = 0 Or strEircode.Length = 0 Then
intErrorCount += 1
MessageBox.Show("One or more details have not been enterred")
txtStreetAddress.Clear()
txtCounty.Clear()
txtEircode.Clear()
txtTown.Clear()
mskNumber.Clear()
ElseIf strStreetAddress.Length > 50 Or strTown.Length > 15 Or strCounty.Length > 10 Or strEircode.Length <> 7 Or mskPhoneNumber.Length <> 10 Then
intErrorCount += 1
MessageBox.Show("One or more detais has been entered incorrectly")
txtStreetAddress.Clear()
txtCounty.Clear()
txtEircode.Clear()
txtTown.Clear()
mskNumber.Clear()
Else MessageBox.Show("All Details Entered Correctly")
Me.Hide()
frmPurchaseScreen.Show()
End If
'if errorcount reaches 5 then operator must login again and restart
If intErrorCount = 5 Then
MessageBox.Show("You have made too many errors, you must Login again")
Me.Hide()
frmLogin.Show()
End If
End Sub

Visual Basic random number for multiple variables

Goal: To make a game were a user will select from 16 different options and receive 16 unique responses. These responses are simple security tips for user training.
They must be in random order so nobody can screen look and predict which button yields which result and they cannot be reused/duplicate responses during a single game.
I have been going back and forth on either to use an array or the select case. The select case is looking more promising, however I am not sure how to assign, randomly, 16 different buttons to provide the correct not repeating responses.
Poor code as requested,
'Create Select Case random value and assign to buttons
Do
btn2 = CInt(Int((3 * Rnd()) + 1))
'lblDescript so I can see what btn2 is outputting
lblDescript.Text = btn2.ToString
Loop While btn2 <> btn1 Or btn3
'***************************************************************************************
'Game Buttons 2 - 16 ************************************************************
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'Button Style
Button2.ForeColor = Color.Transparent
Button2.BackColor = Color.Transparent
Button2.FlatStyle = FlatStyle.Flat
Button2.Text = ""
Button2.UseVisualStyleBackColor = False
'Button2.Enabled = False
'Select Case
Select Case btn2
Case Is = 1
PictureBox1.Image = My.Resources.Login
Button2.BackgroundImage = My.Resources.Login
lblPicName.Text = "Two - Factor Authentication"
lblDescript.Text = "Two - Factor Authentication, or 2FA adds an extra step to a basic log-in procedure."
Case Is = 2
'Content PaceHolder*****
PictureBox1.Image = My.Resources.Cloud
Button2.BackgroundImage = My.Resources.Cloud
lblPicName.Text = "Two - Factor Authentication"
lblDescript.Text = "Two - Factor Authentication, or 2FA adds an extra step to a basic log-in procedure."
Case Is = 3
'Content PaceHolder*****
PictureBox1.Image = My.Resources.Pwmanager
Button2.BackgroundImage = My.Resources.Pwmanager
lblPicName.Text = "Two - Factor Authentication"
lblDescript.Text = "Two - Factor Authentication, or 2FA adds an extra step to a basic log-in procedure."
Case Is = 4
End Select
The picture I have provided shows what I need to happen when I select the first button in the application.
Image to illustrate:
Once the user selects the button the photo will be displayed as the button as well as off to the right with the name and description.
I think you should pursue a solution that is more based on data instead of code. Your code seems to be hard-wiring a good deal of similar or duplicate logic whereas you could just store all the possibilities in a data structure and shuffle it around. Then you would only use the code to present the shuffled results.
Public Class Form1
Class SecurityTip
Public PicName As String
Public Description As String
Public Image As Image
End Class
Private TipList As SecurityTip()
Private ButtonArray As Button()
Protected Overrides Sub OnLoad(e As EventArgs)
MyBase.OnLoad(e)
ButtonArray = New Button() {
Button1, Button2, Button3, Button4, Button5, Button6, Button7, Button8,
Button9, Button10, Button11, Button12, Button13, Button14, Button15, Button16}
For I As Integer = 0 To ButtonArray.Length - 1
AddHandler ButtonArray(I).Click, AddressOf Button_Click
Next
InitializeTips()
ShuffleTips()
End Sub
Public Sub InitializeTips()
TipList = New SecurityTip() {
New SecurityTip() With {
.Image = My.Resources.Login,
.PicName = "Two - Factor Authentication",
.Description = "Two - Factor Authentication, or 2FA adds an extra step to a basic log-in procedure."},
New SecurityTip() With {
.Image = My.Resources.Cloud,
.PicName = "Cloud Authentication",
.Description = "Cloud authentication might also be referred to as federated identity or something."},
New SecurityTip() With {
.Image = My.Resources.Pwmanager,
.PicName = "Password Manager",
.Description = "Password managers help users maintain separate passwords for different sites."}
}
End Sub
Public Sub ShuffleTips()
Dim R As New Random()
For i As Integer = 0 To TipList.Length - 1
Dim SwapIndex = R.Next(TipList.Length)
Dim Temp = TipList(SwapIndex)
TipList(SwapIndex) = TipList(i)
TipList(i) = Temp
Next
End Sub
Public Sub PresentTip(Index As Integer)
With TipList(Index)
PictureBox1.Image = .Image
lblPicName.Text = .PicName
lblDescript.Text = .Description
ButtonArray(Index).BackgroundImage = TipList(Index).Image
End With
End Sub
Private Sub Button_Click(sender As Object, e As EventArgs)
For I As Integer = 0 To ButtonArray.Length - 1
If ButtonArray(I) Is sender Then
PresentTip(I)
Exit Sub
End If
Next
End Sub
End Class
In your code, below
'Button2.Enabled = False
Add
Dim rndNum As Random
Dim randomChoice As Integer = rndNum.Next(1, 4)
and your select case statement to
Select Case randomChoice
Case 1
Case 2
Case 3
Case 4
including the code for each of course.

Huge amount of textboxes repeated code

I have around 200 textboxes in my form.
Pressing "Enter" takes you to the next textbox.
Pressing "Up" takes you to the upper textbox, etc...
I know the coding but it's 200 textboxes so it's gonna be a huge amount of Copy/Paste. Is there any short way i can do it for all the 200 textboxes ?
You really want to show the users 200 textboxes on a single form? You should at least group them in a container control logically, for example in a Panel. Then you could use OfType.
You could add this to the constructor of your form-class which uses anonymous event handler:
Dim allTextBoxes = from txt in Me.TextBoxPanel.Controls.OfType(Of TextBox)()
Order by txt.TabIndex
Dim txtList = allTextBoxes.ToList()
For i As Int32 = 0 To txtList.Count - 1
Dim thisTxt = txtList(i)
Dim nextIndex = If(i + 1 >= txtList.Count, 0, i + 1)
Dim prevIndex = If(i - 1 < 0, txtList.Count - 1, i - 1)
Dim nextTxt = txtList(nextIndex)
Dim prevTxt = txtList(prevIndex)
AddHandler thisTxt.KeyDown,
Sub(txt As Object, e As KeyEventArgs)
If e.KeyCode = 38 Then 'up
Me.ActiveControl = prevTxt
ElseIf e.KeyCode = 13 Then 'enter
Me.ActiveControl = nextTxt
End If
End Sub
Next

Trouble with Timer_tick not stopping

I'm very new to programming and vb.net, trying to self teach more so as a hobby, as I have an idea for a program that I would find useful, but I am having trouble getting past this issue and I believe it is to do with the timer.
I have a form of size.(600,600) with one button of size.(450,150) that is set location(100,50) on the form. When clicked I want to move down it's own height, then add a new button in it's place. The code included below works as desired for the first two clicks, but on the third click the button keeps moving and the autoscroll bar extends. I initially thought it was the autoscroll function or the location property, but realised that as the button keeps moving, the timer hasn't stopped. I am aware that the code is probably very clunky in terms of achieving the outcome, and that there are a few lines/variables that are currently skipped over by the compiler (these are from older attempts to figure this out).
I have looked around and can't find the cause of my problem. Any help would be greatly appreciated. Apologies if the code block looks messy - first go.
Public Class frmOpenScreen
Dim intWButtons, intCreateButtonY, intCreateButtonX 'intTimerTick As Integer
Dim arrWNames() As String
Dim ctrlWButtons As Control
Dim blnAddingW As Boolean
Private Sub btnCreateW_Click(sender As System.Object, e As System.EventArgs) Handles btnCreateW.Click
'Creates new Button details including handler
Dim strWName, strWShort As String
Dim intCreateButtonY2 As Integer
Static intNumW As Integer
Dim B As New Button
strWName = InputBox("Please enter the name name of the button you are creating. Please ensure the spelling is correct.", "Create W")
If strWName = "" Then
MsgBox("Nothing Entered.")
Exit Sub
End If
strWShort = strWName.Replace(" ", "")
B.Text = strWName
B.Width = 400
B.Height = 150
B.Font = New System.Drawing.Font("Arial Narrow", 21.75)
B.AutoSizeMode = Windows.Forms.AutoSizeMode.GrowAndShrink
B.Anchor = AnchorStyles.Top
B.Margin = New Windows.Forms.Padding(0, 0, 0, 0)
'Updates Crucial Data (w name array, number of w buttons inc Create New)
If intNumW = 0 Then
ReDim arrWNames(0)
Else
intNumW = UBound(arrWNames) + 1
ReDim Preserve arrWNames(intNumW)
End If
arrWNames(intNumW) = strWShort
intNumW = intNumW + 1
intWButtons = WButtonCount(intWButtons) + 1
'updates form with new button and rearranges existing buttons
intCreateButtonY = btnCreateW.Location.Y
intCreateButtonX = btnCreateW.Location.X
‘intTimerTick = 0
tmrButtonMove.Enabled = True
‘Do While intTimerTick < 16
‘ 'blank to do nothing
‘Loop
'btnCreateW.Location = New Point(intCreateButtonX, intCreateButtonY + 150)
B.Location = New Point(intCreateButtonX, intCreateButtonY)
Me.Controls.Add(B)
B.Name = "btn" & strWShort
intCreateButtonY2 = btnCreateW.Location.Y
If intCreateButtonY2 > Me.Location.Y Then
Me.AutoScroll = False
Me.AutoScroll = True
Else
Me.AutoScroll = False
End If
'MsgBox(intCreateButtonY)
End Sub
Function WButtonCount(ByRef buttoncount As Integer) As Integer
buttoncount = intWButtons
If buttoncount = 0 Then
Return 1
End If
Return buttoncount
End Function
Public Sub tmrButtonMove_Tick(sender As System.Object, e As System.EventArgs) Handles tmrButtonMove.Tick
Dim intTimerTick As Integer
If intTimerTick > 14 Then
intTimerTick = 0
End If
If btnCreateW.Location.Y <= intCreateButtonY + 150 Then
btnCreateW.Top = btnCreateW.Top + 10
End If
intTimerTick += 1
If intTimerTick = 15 Then
tmrButtonMove.Enabled = False
End If
End Sub
End Class
So my current understanding is that the tick event handler should be increasing the timertick variable every time it fires, and that once it has hits 15 it should diable the timer and stop the button moving, but it is not doing so.
Thanks in advance.
IntTimerTick is initialized to 0 at the beginning of every Tick event. This won't happen if you declare it to be static:
Static Dim intTimerTick As Integer

DataGridView not Refreshing/Updating/Reloading Data. After Child form closes

This is a VB.NET, Winforms App. I have a datagridview on "Form1" that uses a databinding.datasource which is an Entity Framework table. I fill the datagridview with the below function on Form1:
Sub PM_UnitViewGrid()
Try
_form1.UnitsBindingSource.DataSource = db.units.Where(Function(f) f.propertyId = _form1.CurrentPropertyId).OrderBy(Function(F) F.unitNumber)
_form1.UnitDataGridView.DataSource = _form1.UnitsBindingSource.DataSource
Dim iCount As Integer = _form1.UnitDataGridView.RowCount
For x As Integer = 0 To iCount - 1
If Not IsNothing(_form1.UnitDataGridView.Rows(x).Cells(4).Value) Then
Dim tid As Integer = _form1.UnitDataGridView.Rows(x).Cells(4).Value
Dim _ten As tenant = db.tenants.Single(Function(f) f.Occupantid = tid)
_form1.UnitDataGridView.Rows(x).Cells(1).Value = _ten.first_name + ", " + _ten.last_name
Else
Dim btnColumn As DataGridViewButtonCell = CType(_form1.UnitDataGridView.Rows(x).Cells(1), DataGridViewButtonCell)
btnColumn.Style.BackColor = Color.Green
_form1.UnitDataGridView.Rows(x).Cells(1).Value = "VACANT"
End If
Next
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Return
End Sub
This works great and also assigns the needed values to an unbound column. The problem is that the cells(1) is a button. Which when clicked takes the user to another form as a new dialog window. The function for which is below. However, once the changes are made in that form I need for the datagridview to refresh the data that its using from the database and show the correct data. As it stands right now the values are not updating on the datagridview unless the app is completely exited and restarted. Nothing I have found seems to work and Refresh and Update only redraw the control. I need the underlying datasource to refresh and then the datagridview once the child form is exited.. This has had me stumped for a good 36 hours now and I am lost as to why nothing I am trying is working. ANY and all help would be greatly appreciated.
The sub that loads the child form based on the cells(1) button clicked is as follows:
Private Sub UnitDataGridView_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles UnitDataGridView.CellContentClick
UnitDataGridView.CommitEdit(DataGridViewDataErrorContexts.CurrentCellChange)
Dim y As DataGridViewCellEventArgs = e
Dim Tid As Integer = Nothing
If e.ColumnIndex = 1 Then
If Not e.RowIndex = -1 Then
If Not IsNothing(UnitDataGridView.Rows(e.RowIndex).Cells(4).Value) Then
currentTenent = UnitDataGridView.Rows(e.RowIndex).Cells(4).Value
TenentIdentification = currentTenent
If Not IsNothing(e) Then
If Not IsNothing(UnitDataGridView.Rows(e.RowIndex).Cells(4).Value) Then
Tid = UnitDataGridView.Rows(e.RowIndex).Cells(4).Value
Dim _ten As tenant = db.tenants.Single(Function(f) f.Occupantid = Tid) 'tenant is a table entity
TenantViewSubs.tenId = _ten.Occupantid
Dim t As New TenantView
t.tenId = tid
t.ShowDialog()
End If
End If
PropertyManagSubs.PM_UnitViewGrid() 'This is the function that is above that fills the datagridview
Else
Dim uTview As New UnassignedTenants
uTview.selectedProperty = selectedProperty 'selectedProperty is Integer
uTview.ShowDialog()
PropertyManagSubs.PM_UnitViewGrid() 'This is the function that is above that fills the datagridview
End If
End If
End If
End Sub
I tried each of the following code blocks after the t.ShowDialog() line with no change at all.
UnitDataGridView.Refresh()
.
UnitsBindingSource.Dispose()
UnitsBindingSource.DataSource = db.units.Where(Function(f) f.propertyId = selectedProperty).OrderBy(Function(f) f.unitNumber)
UnitDataGridView.DataSource = UnitsBindingSource.DataSource
.
UnitsBindingSource.DataSource = nothing
unitsBindingSource.DataSource = db.units.Where(Function(f) f.propertyId = selectedProperty).OrderBy(Function(f) f.unitNumber)
UnitDataGridView.DataSource = UnitsBindingSource.DataSource
I finally fixed this on my own.. It was in the way I passed my db context to the databinding..
I simply wrote the below sub:
Private Sub UpdateValues()
Dim context As New storageEntities 'storageEntities is an Entity
Dim query = context.units.Where(Function(F) F.propertyId = selectedProperty).OrderBy(Function(f) f.unitNumber)
UnitDataGridView.DataSource = query
End Sub
Then anytime a child form updated data I simply call
UpdateValues()
After the dialog box closes.
This may help someone else with the same problems so that is why I am posting it.