kooch83
asked on
vb.net 2008 Event loop
Using vb.net 2008 i noticed while debugging that an event such as a rightClickMenuItem.itemCli cked runs throught the procedure code multiple times. Upwards of 30 i counted once while debugging and while running. This results in my code generating a null value when it shouldn't and ultimately crashing?? Any suggestions would be most helpful. Below is the code for rightClickMenuStrip.itemCl icked. The function getEmployeeNameScheduling returns the text of a control on a tableLayoutPanel at a given row passed in by the rightClickMenuItem Sender.sourceControl. The deleteEntryFromEmployeeTab le function deletes an entry in an SQL database which tracks controls on the tableLayoutPanel.
Private Sub rightClickMenuStrip_ItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles rightClickMenuStrip.ItemClicked
Dim count As Integer = 0
Dim jobLabel As String = Nothing
Dim controlStartColumn As Integer = 0
Dim controlStartRow As Integer = 0
Dim controlRowSpan As Integer = 0
Dim controlColumnSpan As Integer = 0
Dim sqlDeleteString As String = Nothing
Dim employeeName As String = Nothing
Dim entryDate As DateTime = Nothing
Dim startLocation As Integer = Nothing
Dim startRow As Integer = 0
If e.ClickedItem.Text = "Delete" Then
'get information need to delete entry
startRow = tableLayout.GetRow(sender.sourceControl)
employeeName = getEmployeeNameScheduling(startRow)
entryDate = sender.sourceControl.tag
startLocation = tableLayout.GetRow(sender.sourceControl) Mod 6
deleteEntryFromEmployeeTable(employeeName, entryDate, startLocation)
'delete the control from the table
tableLayout.Controls.Remove(sender.sourcecontrol)
End If
End Sub
ASKER
To be more elaborate in helping you understand::
- my program basically is a tableLayoutPanel in which a user can drag and drop another control onto it. in this case the control is a button of the class resizable. when the button is created i pass in the rightclickmenu and the tableLayoutpanel which the button is added to. The code i provided above is from the resizable class. The recursive part you mentioned i have pondered before. I have even tried the bool test which you provided above before but on debugging the bool value which i declared in the resizeable class gets reset every time the itemClicked event runs. With that said the function in the above code getEmployeeNameScheduling only returns the text value associated with a name control on the tableLayoutPanel that is related to the button right clicked on. Could this be where the recursion is happening. When i call this function and use the command tableLayout.GetControlFrom Position(0 ,row).text . Does the compiler then fire the itemClicked event again?? Hope this helps a little
- my program basically is a tableLayoutPanel in which a user can drag and drop another control onto it. in this case the control is a button of the class resizable. when the button is created i pass in the rightclickmenu and the tableLayoutpanel which the button is added to. The code i provided above is from the resizable class. The recursive part you mentioned i have pondered before. I have even tried the bool test which you provided above before but on debugging the bool value which i declared in the resizeable class gets reset every time the itemClicked event runs. With that said the function in the above code getEmployeeNameScheduling only returns the text value associated with a name control on the tableLayoutPanel that is related to the button right clicked on. Could this be where the recursion is happening. When i call this function and use the command tableLayout.GetControlFrom
There's about a million things that could be wrong. I'm afraid you'll have to do some debugging on the code yourself. Things to check:
- Look at the stack trace when you hit a breakpoint in the method. How does it get called?
- If it were my code, I would add a print to console at every line in the method. Then analyze if any particular line is resulting in a call to the same method.
- Look for some other point of entry like, for example, is some event getting called because the previous control lost focus?
Sorry I can't help more.
- Look at the stack trace when you hit a breakpoint in the method. How does it get called?
- If it were my code, I would add a print to console at every line in the method. Then analyze if any particular line is resulting in a call to the same method.
- Look for some other point of entry like, for example, is some event getting called because the previous control lost focus?
Sorry I can't help more.
try to avoid the program crash validating for null before use objects, does it crash anyway?
instead of going directly to check the Text on e.ClickedItem.Text check if e is not null and then if e.ClickedItem is not null.. etc...
Also try to suspend table layout before doing any modification on it using a code like this:
instead of going directly to check the Text on e.ClickedItem.Text check if e is not null and then if e.ClickedItem is not null.. etc...
Also try to suspend table layout before doing any modification on it using a code like this:
private void AddButtons()
{
// Suspend the form layout and add two buttons.
this.SuspendLayout();
Button buttonOK = new Button();
buttonOK.Location = new Point(10, 10);
buttonOK.Size = new Size(75, 25);
buttonOK.Text = "OK";
Button buttonCancel = new Button();
buttonCancel.Location = new Point(90, 10);
buttonCancel.Size = new Size(75, 25);
buttonCancel.Text = "Cancel";
this.Controls.AddRange(new Control[]{buttonOK, buttonCancel});
this.ResumeLayout();
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
You might be able to fix this by declaring a variable in the class like
bool active = false;
then when you enter the method do this
if (active)
return;
active = true;
and just before the method returns put
active = false;