Add click to control inside a panel - vb.net

Morning,
I am trying to add a click event for the controls that i add into my Panel dynamically. The control i add is a custom class that i have created called 'Slide'.
Here is the code where i build the Slide class that will be added to the panel:
Dim thisControl As New Slide()
With thisControl
.Dock = System.Windows.Forms.DockStyle.Left
.Thumbnail.Image = ThisSlide
.Thumbnail.BackColor = Color.Transparent
.Caption.Text = "Slide" & radSlides.SelectedIndex
.Ordinal = pnlScheduledSlides.Controls.Count.ToString
.Duration = Conversion.Int(20)
.Content = pContent
End With
Then I add 'thisControl' to the panel:
pnlScheduledSlides.Controls.Add(thisControl)
I am wanted to be able to click on a Slide inside the panel so that i can add some functionality to be able to add/remove the slide.

You need a dinamic event handler
Addhandler thisControl.Click, AddressOf your_dinamic_click
Where your_dinamic_click is something like this:
Private sub your_dinamic_click(sender As Object, e As EventArgs)
I'm supposing that your Slide control raises a "click" event

Related

How do you set a dynamically created panel to false in VB.net?

I have on my screen design Panel1(left half), and panel2 through 10(right half), the panels on the right half are named based on data from a database.
I need to be able to click on a button in panel1 and when I do so, I need to set visibility to false for the current panel on the right half and set visibility to true that is referenced from the button click. I know that I can do the following but I think this is just way too much overhead and there has to be a better solution than this:
For Each control In Me.Controls.OfType(Of Panel)
If control.visible = true Then
control.visible = false
exit
Next
Panel that the visibility that needs to be set to false was dynamically created so it can not just be accessed by just name, otherwise that would solve my issue easily.
I seen this bit of code elsewhere and it would make my life easier, however not sure how to implement it dynamically when the panels are created, since the name of the panels are unknown at creation.
This bit of code to be able to reference the panels directly.
Dim machinePanel As Panel = DirectCast(Me.Controls.Item("pnl" & strMTB & strMachineID), Panel)
I'm not sure what you mean but "is referenced from the button click", so I'll assume that the text of the button refers to the panel name.
Create a method that handles the visibility
Private Sub SetPanelVisibility(button As Button)
'panel that the button is in
Dim leftPanel = CType(button.Parent, Panel)
'get right panels and ignore left
Dim rightpanels = Me.Controls.OfType(Of Panel).Where(Function(x) x.Name <> leftPanel.Name)
'set visibility of each panel.
For Each panel In rightpanels
panel.Visible = panel.Name = button.Text
Next
End Sub
To call the method just pass the button in on the click event. e.g.
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
SetPanelVisibility(sender)
End Sub

Programmatically made button destroying itself

I'm trying to make a button that is programmatically created and when clicked it can destroy itself (and other programmatically made objects).
This is the sub that is called to create the button (alongside two other textboxes ive removed from this code)
Public Sub createProduct(i As Integer)
'Creating the button to be able to Delete the product
'i is used as a way to keep track of each row of products
Dim DeleteProduct As Button = New Button
With DeleteProduct
.Size = New Size(20, 20)
.Location = New Point(240, 50 + (i * 25))
.Text = New String("-")
.Name = "btnRemoveProduct" + i.ToString
UserButtons.Add(DeleteProduct)
End With
Me.Controls.Add(DeleteProduct)
AddHandler DeleteProduct.Click, AddressOf DeleteProductButton
End Sub
Which links the button to this code
Friend Sub DeleteProductButton(sender As Object, e As EventArgs)
End Sub
However, I can't find any way to be able to refer to the button (and the other textboxes) in the DeleteProductButton sub, and therefore can't delete them once the button is pressed.

Visual Basic Dynamically Create and Erase Controls

I use Visual Basic in Visual Studio 2015 and i am trying when i click on a StripMenu to appear me some TextBoxes and Buttons.
After another click in Stripmenu i want to erase them and add new one.
My problem is in Erase (delete or clear my buttons and textboxes) controls from my surface.
I try to do it use Button.Visible =True (or False) but it's not seems to be really helpful in a big amount of controls.
Private Sub ClassAToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ClassAToolStripMenuItem.Click
Label1.Text = "Sum A class Students: "
Dim btnA As Button = New Button
btnA.Location = New Point(420, 180)
btnA.Name = "Btn1"
btnA.Text = "OK"
btnA.Visible = True
Me.Controls.Add(btnA)
AddHandler btnA.Click, AddressOf button
End Sub
Private Sub button()
'What my Button does.
End Sub
I create dynamically through this code my Button but if i want to go in another Menu option i want to erase this button to add again my new controls (such us new buttons labels etc).
Your declaration is out of scope since you declared it in the menu's click method. You would have to use the Find method to get back the reference to the control you created:
Dim btn = Me.Controls.Find("Btn1", True).FirstOrDefault()
If btn IsNot Nothing Then
btn.Dispose()
End If
If you are trying to replace the contents of a panel with a new "screen" on your menu click, you can try code like this:
While Panel1.Controls.Count > 0
Panel1.Controls(0).Dispose()
End While
Dim newControl As New UserControl1
newControl.Dock = DockStyle.Fill
Panel1.Controls.Add(newControl)

Open Tabs Control

I'm using MDI container to run my bussiness application I created for my client.
Since using MDI means that when I open several forms they will still run in background all the time untill I close them manualy.
What I need is to make User Control or anything else that could preview all opened forms in Tab Form so my client can easily close all or some of opened forms without closing a form he is curently viewing.
For now I have used this code, so for now only first clicked item from menu appears as button, but not others clicked menu items.
Private Sub MenuStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles MenuStrip1.ItemClicked
Dim Button As New Button
Me.Panel5.Controls.Add(Button)
Button.Text = e.ClickedItem.Name
Button.Width = 50
Button.Height = 25
End Sub
Now I need to write a code to add more buttons bellow, also should add a code for adding buttons only when I click on SubMenu item (The one when is clicked new Form appear).
And also, I should now add a little Close button into previewed User-Button-Control.
From your comments, I understand that your ideas regarding adding buttons at runtime are not too clear and thus I am including a small code which hopefully will help you on this front. Start a new project and put a Panel (Panel5) and a Button (AddButtons) on it, and write this code:
Dim lastButtonIndex, lastLeft, lastTop As Integer
Private Sub Button_Click(sender As System.Object, e As System.EventArgs)
Dim curButton As Button = DirectCast(sender, Button)
If (curButton.Name = "Button1") Then
'do Button1 stuff
End If
'etc.
End Sub
Private Sub addNewButton()
lastButtonIndex = lastButtonIndex + 1
lastLeft = lastLeft + 5
lastTop = lastTop + 5
Dim Button As New Button
With Button
.Name = "Button" + lastButtonIndex.ToString()
.Text = "Button" + lastButtonIndex.ToString()
.Width = 50
.Height = 25
.Left = lastLeft
.Top = lastTop
AddHandler .Click, AddressOf Button_Click
End With
Me.Panel5.Controls.Add(Button)
End Sub
Private Sub ButtonAddButtons_Click(sender As System.Object, e As System.EventArgs) Handles AddButtons.Click
addNewButton()
End Sub
This code will add a new button to the panel every time you click on AddButtons. All the buttons will have an associated Click Event (the same one for all of them): Button_Click. The way to know which button is the current one inside this method is via sender, as shown in the code (you can put as many conditions as buttons. The names are given sequentially starting from 1; but you can take any other property as reference, curButton is the given Button Control).
Bear in mind that one of the problems you have to take care of is the location of the buttons. The code above has a very simplistic X/Y values (Left/Top properties) auto-increase which, logically, will not deliver what you want.

How to Add Click Listener to Programmatically Added Tabcontrol

In my application i'm programmatically adding a tab like so:
'show searchresults tab if not present
If Not TabControl1.TabPages.Contains(tabSearchresults) Then
TabControl1.TabPages.Insert(3, tabSearchresults)
End If
Now I cant seem to manually add a click event listener to that tab in design view, and when I do so in codeview nothing happens when I click that tab.
So the question is,.. How do I add a click listener to that tabSearchresults tab?
I assume that your tabSearchresults is your TabPage.
So first create a function which will be handler of Click event
Private Sub tabSearchresults_Click(sender as Object, e as EventArgs)
'your code ...
End Sub
Then after line where you initialize your TabPage add this handler:
tabSearchresults = New TabPage()
AddHandler tabSearchresults.Click, AddressOf tabSearchresults_Click