VB.NET... not C please.
I have made a menu with dynamically created buttons consisting of a total of 18 buttons. I have need to change the background of any button when the mouse hover/mouseover event occurs but am at a loss as to how to add this feature.
My current code is as follows:
Dim btnBilling As New ToolStripButton
With btnBilling
'Set properties
.BackgroundImage = My.Resources.ToolBarBkGrd2
.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
.TextImageRelation = TextImageRelation.ImageBeforeText
.Image = My.Resources.Billing
.Font = New Font("Calibri", 8.25, FontStyle.Bold)
.Text = "Billing" & vbNewLine & "Info"
End With
'Create Handle to Click Event
AddHandler btnBilling.Click, AddressOf BtnBilling_Click
'Add button to toolstrip
ToolStrip1.Items.Add(btnBilling)
'Billing Button Events
Private Sub BtnBilling_Click(sender As Object, e As EventArgs)
Bill()
End Sub
Public Sub Bill()
If ActiveMdiChild IsNot Nothing Then ActiveMdiChild.Close()
Billing.MdiParent = Me
Billing.Show()
End Sub
How and where would I add the mouse hover event handler. The only mouse hover event, planned for right now, would be to change the background image to My.Resources.ToolBarBkGrd3
The menu is on a PARENT form that stays visible at all times. Only the current child form closes and loads in the new child form.
This is how I ended up resolving my issue.
Thanks specifically to John for the nudge in the correct direction.
Private BkGrd = resources.GetObject("ToolBarBkGrd2")
Private Bkgrd1 = resources.GetObject("ToolBarBkGrd3")
Dim btnBilling As New ToolStripButton
With btnBilling
'Set properties
.BackgroundImage = CType(BkGrd, Drawing.Image)
.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
.TextImageRelation = TextImageRelation.ImageBeforeText
.Image = My.Resources.Billing
.Font = New Font("Calibri", 8.25, FontStyle.Bold)
.Text = "Billing" & vbNewLine & "Info"
End With
'Create handle for MouseEnter Event
AddHandler btnBilling.MouseEnter, AddressOf BtnBilling_MouseEnter
'Create handle for MouseLeave Event
AddHandler btnBilling.MouseLeave, AddressOf BtnBilling_MouseLeave
'Create a Handle to a Click Event
AddHandler btnBilling.Click, AddressOf BtnBilling_Click
'Billing Button Events
Private Sub BtnBilling_MouseEnter(sender As Object, e As EventArgs)
With sender
'Set properties
.BackgroundImage = CType(BkGrd1, Drawing.Image)
End With
End Sub
Private Sub BtnBilling_MouseLeave(sender As Object, e As EventArgs)
With sender
'Set properties
.BackgroundImage = CType(BkGrd, Drawing.Image)
End With
End Sub
Private Sub BtnBilling_Click(sender As Object, e As EventArgs)
Bill()
End Sub
Public Sub Bill()
If ActiveMdiChild IsNot Nothing Then ActiveMdiChild.Close()
Billing.MdiParent = Me
Billing.Show()
End Sub
Related
I am working on a music program that gives user the option to enter a number in a textbox and creates that many buttons inside a container. I want every button created to be named 'btn' followed by a number generated in a loop. Following is the code I have so far:
Private Sub txtNum_TextChanged(sender As Object, e As EventArgs) Handles txtNum.TextChanged
For i As Integer = 1 To CInt(txtNum)
Dim strName as String = "btn" & i.ToString()
Dim <strName> as New Button
Next
End Sub
I know the line in my code where the button is being created doesn't work. How can I do this? Is there another way I can achieve this in VB.NET?
You should set the Name property of a button with, but I think you should avoid using the TextChanged event to do this. This handler is called everytime you type a single character in the textbox (also when your user mistypes something and the cancel its input to fix the error) so it is better to have a Create button that on click event handles the task
Private Sub bntCreate_Click(sender As Object, e As EventArgs) Handles btnCreate.Click
For i As Integer = 1 To CInt(txtNum.Text)
Dim strName as String = "btn" & i.ToString()
Dim btn as New Button
btn.Name = strName
' Now calculate the Location property to place your button
btn.Location = new Point(0, i * 20)
' Set the button click handler (same handler for all buttons)
AddHandler btn.Click, AddressOf onClick
' And finally add it to the form controls collection.
Me.Controls.Add(btn)
Next
End Sub
Sub onClick(ByVal sender as Object, ByVal args as EventArgs)
Dim btn = DirectCast(sender, Button)
if btn.Name = "btn1" Then
' Code for btn1
else if btn.Name = "btn2" Then
.....
End If
End Sub
The tricky part is how to position the buttons on your form. In the sample above the buttons are places in a vertical arrangement with 20 pixels of interval between their Top location, but this leads to other problems (buttons can be placed outside the form borders). If the number of buttons allows is high then you should try to use a FlowLayoutPanel to have them automatically arranged according to the FlowLayout settings
you have to add the button to the controls of your form, and create an event handler
> Private Sub txtNum_TextChanged(sender As Object, e As EventArgs)
> Handles txtNum.TextChanged
> For i As Integer = 1 To CInt(txtNum)
> Dim strName as String = "btn" & i.ToString()
> Dim btn as New button
> With btn
> .Size = (100,20)
> .Location = (20,20)
> End With
> AddHandler btn.Clicked, AddressOf btn_Clicked
> MyForm.Controls.Add(btn )
> Next
> End Sub
I have few pannels and button created dynamically now I need to access panel on button click event.
This is how i am creating dynamic button and Pannel
While rst.Read()
Dim panel As New Panel
Dim panel1 As New Panel
Dim mylink As New LinkLabel
Dim btn As New Button
Dim Tooltip As New ToolTip()
Tooltip.SetToolTip(mylink, rst!form_name)
mylink.Name = rst!form_name
AddHandler mylink.Click, AddressOf HandleDynamicLinkLabelClick
AddHandler btn.Click, AddressOf HandleDynamicButtonClick
mylink.Dock = DockStyle.Left
btn.Name = rst!form_name
btn.Tag = rst!form_name
panel1.Tag = rst!form_name
btn.Text = "<"
panel.Controls.Add(mylink)
panel.Controls.Add(btn)
panel1.Name = rst!form_name
panel1.Controls.Add(lbl)
Me.FlowLayoutPanel1.Controls.Add(panel)
Me.FlowLayoutPanel1.Controls.Add(panel1)
End While
rst.Close()
This is the code for dynamic button click event here i need to access pannel1 from the above procedure
Private Sub HandleDynamicButtonClick(ByVal sender As Object, ByVal e As EventArgs)
Dim btn As Button = DirectCast(sender, Button)
End Sub
You need to be able to actively 'know' what the names of your dynamically created controls are so try something like this:
Private Name1 As String
Private Name2 As String
while rst.read
Dim panel As New Panel
Dim panel1 As New Panel
Dim mylink As New LinkLabel
Dim btn As New Button
Dim Tooltip As New ToolTip()
Tooltip.SetToolTip(mylink, rst!form_name)
mylink.Name = rst!form_name
AddHandler mylink.Click, AddressOf HandleDynamicLinkLabelClick
AddHandler btn.Click, AddressOf HandleDynamicButtonClick
mylink.Dock = DockStyle.Left
Name1 = cstr(rst!form_name)
btn.Name = Name1
btn.Tag = rst!form_name
panel1.Tag = rst!form_name
btn.Text = "<"
panel.Controls.Add(mylink)
panel.Controls.Add(btn)
Name2 = Cstr(rst!form_name)
panel1.Name = Name2
panel1.Controls.Add(lbl)
Me.FlowLayoutPanel1.Controls.Add(panel)
Me.FlowLayoutPanel1.Controls.Add(panel1)
end while
Private Sub HandleDynamicButtonClick(ByVal sender As Object, ByVal e As EventArgs)
Dim btn As Button = DirectCast(sender, Button)
Select Case btn.Name
Case Name1
'do something here
End Select
End Sub
You're already storing "rst!form_name" in the Name of the Button:
btn.Name = rst!form_name
So why not store the Panel in the Tag instead?
btn.Tag = panel1
Then you can retrieve it in your handler:
Private Sub HandleDynamicButtonClick(ByVal sender As Object, ByVal e As EventArgs)
Dim btn As Button = DirectCast(sender, Button)
Dim panel1 As Panel = DirectCast(btn.Tag, Panel)
' ... use "panel1" somehow ...
End Sub
Hello I have a working code for a project i am making...
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim FolderDlg = FolderBrowserDialog1
'Checks if there is a value to the Selected folder
If FolderDlg.SelectedPath = "" Then
'If no value asks to set one
MsgBox("Please Set a Directory")
FolderDlg.ShowDialog()
If DialogResult.OK Then
Button1.Text = Path.GetFileName(FolderDlg.SelectedPath)
End If
Exit Sub
End If
Process.Start("explorer.exe", FolderDlg.SelectedPath)
End Sub
I want to be able to have "AddNew" Button that creates a a copy of this code. I know how to create dynamic buttons but they all call the same FolderBrowserDialog..
EDIT This is My Add New Button That Creates Buttons With Tags And Also Creates FolderBrowserDialogs with Tags.
Private Sub AddNew_Click(sender As Object, e As EventArgs) Handles AddNew.Click
Dim count As Integer = FloLay.Controls.OfType(Of Button)().ToList().Count
Dim button As New Button()
count = FloLay.Controls.OfType(Of Button)().ToList().Count
'button.Location = New System.Drawing.Point(150, 25 * count)
'button.Size = New System.Drawing.Size(60, 20)
button.Name = "button_" & (count + 1)
button.Text = "Button_ " & (count + 1)
button.Tag = "Button_" & (count + 1)
AddHandler button.Click, AddressOf Set_Dir
Dim FolderDlg As New FolderBrowserDialog
count = FloLay.Controls.OfType(Of FolderBrowserDialog)().ToList().Count
FolderDlg.Tag = "FolderDlg_" & (count + 1)
FloLay.Controls.Add(button)
End Sub
EDIT 3 This is My NEW NEW Event Handler
Private Sub Set_Dir(sender As Object, e As EventArgs)
Dim btn = DirectCast(sender, Button)
If btn.Tag Is Nothing Then
Using fbd As New FolderBrowserDialog
fbd.ShowDialog()
btn.Tag = fbd.SelectedPath
End Using
End If
Dim path = CStr(btn.Tag)
' MsgBox(path)
Process.Start("explorer.exe", path)
End Sub
Now only to Add the Button.Name = GetFileNAme and persistance after app restart or reboot
EDIT 4
Private Sub Set_Dir(sender As Object, e As EventArgs)
Dim btn = DirectCast(sender, Button)
If btn.Tag Is Nothing Then
Using fbd As New FolderBrowserDialog
fbd.ShowDialog()
btn.Tag = fbd.SelectedPath
btn.Text = path.GetFileName(fbd.SelectedPath)
End Using
Exit Sub
End If
Dim Folderpath = CStr(btn.Tag)
' MsgBox(Folderpath)
Process.Start("explorer.exe", Folderpath)
End Sub
Now It Works like a Charm!
You can't create a copy of the code. What you need to do is have the code in the event handler determine what to do based on the Button that was clicked. When you create a Button, you can store some data in its Tag property. In the event handler, the sender parameter is a reference to the object that raised the event, i.e. the Button that was clicked. You can then get that data back from its Tag property and use it. You would use that data to configure the FolderBrowserDialog in whatever manner is appropriate for that Button. E.g.
Creating the Button:
Dim btn As New Button
AddHandler btn.Click, AddressOf ButtonClicked
Me.Controls.Add(btn)
Inside the event handler:
Dim btn = DirectCast(sender, Button)
If btn.Tag Is Nothing Then
Using fbd As New FolderBrowserDialog
fbd.ShowDialog()
btn.Tag = fbd.SelectedPath
End Using
End If
Dim path = CStr(btn.Tag)
'Use path here.
Note that the Tag property is type Object so it can be anything you want. It can be as simple as an Integer or as complex as a DataSet. You simply cast it as the appropriate type in the event handler and then access all the data as normal.
my vb.net application i have one toolstrip menu.while clicking tool strip.i am opening four fourms at a time..this all are my child forums.so i given code in
InvolveAllToolStripMenuItem_Click:
Private Sub InvolveAllToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InvolveAllToolStripMenuItem.Click
AddHandler Me.KeyUp, AddressOf HandleKeyPress
Dim frm As New frmKeyAssignBoard
frm.Location = New Point(625, 0)
frm.MdiParent = Me
AddHandler frm.KeyUp, AddressOf HandleKeyPress
frm.Show()
Dim frm1 As New FrmrecievedDelivaryRequest
frm1.Location = New Point(625, 225)
frm1.MdiParent = Me
AddHandler frm.KeyUp, AddressOf HandleKeyPress
frm1.Show()
Dim frm2 As New FrmDelivary
frm2.Location = New Point(965, 0)
frm2.MdiParent = Me
AddHandler frm.KeyUp, AddressOf HandleKeyPress
frm2.Show()
Dim frm3 As New frmCarCall
frm3.Location = New Point(0, 0)
frm3.MdiParent = Me
AddHandler frm.KeyUp, AddressOf HandleKeyPress
frm3.Show()
End Sub
I want to set some function keys here:
If i click f3, i want to locate cursor to particular textbox inside the frmKeyAssignBoard.
If i click f4, i want to locate cursor to particular textbox inside the FrmrecievedDelivaryRequest.
So where i can write program for this ?
To capture the key press event, normally we handle form's KeyPress or KeyUp event.
however at your case, you got 5 forms open (parent + 4 children). thus i would suggest you write the handler in the parent form, but register all children's keypress event to it, some pseudocode:
Sub ShowChildren()
' Handle own Key up event
AddHandler Me.KeyUp, AddressOf HandleKeyPress
' form 1
Dim frm As New frmKeyAssignBoard()
frm.Location = New Point(625, 0)
frm.MdiParent = Me
AddHandler frm.KeyUp, AddressOf HandleKeyPress
' similar for frm2, frm3, ...
'
End Sub
Private Sub HandleKeyPress(sender As Object, e As KeyEventArgs)
If e.KeyCode = Keys.F2 Then
' do whatever necessary when F2 is pressed
ElseIf e.KeyCode = Keys.F3 Then
' do whatever necessary when F3 is pressed
' for example, if you want fo focus on frm1's particular control
' but have to expose TxtBox as a public readonly property beforehand
frm1.BringToFront()
frm1.TxtBox.Select()
frm1.TxtBox.Focus()
ElseIf e.KeyCode = Keys.F4 Then
' do whatever necessary when F4 is pressed
Else
'...
End If
End Sub
I have a programs path..like utorrent and it pid too. I have achieved these values programatically using vb.net. I just want to hide their icon form tray just to run them in background and if possible attach the process with a hotkey to call them back. Is there any way to achieve this.
Option Strict On
Option Explicit On
Option Infer Off
Imports TrayHelper
Public Class Form1
Dim x1, y1 As Single
Friend WithEvents lv As New ListView With {.Parent = Me, .Dock = DockStyle.Fill}
Private il As New ImageList
Dim nxt As Integer
Friend WithEvents mnuContextMenu As New ContextMenu() 'Moved this to be declared as global
Dim mnuItemHide As New MenuItem()
Dim mnuItemExit As New MenuItem()
Dim things As List(Of TrayButton) = TrayHelper.Tray.GetTrayButtons()
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Controls.Add(lv)
lv.View = View.Details
il.ColorDepth = ColorDepth.Depth32Bit
lv.SmallImageList = il
lv.Columns.Add("Button Text", 300, HorizontalAlignment.Left)
lv.Columns.Add("PID", 50, HorizontalAlignment.Left)
lv.Columns.Add("Process Path", 600, HorizontalAlignment.Left)
'Dim things As List(Of TrayButton) = TrayHelper.Tray.GetTrayButtons()
For Each b As TrayButton In things
If b.Icon IsNot Nothing Then
il.Images.Add(b.TrayIndex.ToString, b.Icon)
Else
' When we can't find an icon, the listview will display this form's one.
' You could try to grab the icon from the process path I suppose.
il.Images.Add(b.TrayIndex.ToString, Me.Icon)
End If
Dim lvi As New ListViewItem(b.Text)
lvi.SubItems.Add(b.ProcessIdentifier.ToString)
lvi.SubItems.Add(b.ProcessPath)
lvi.ImageKey = b.TrayIndex.ToString
lv.Items.Add(lvi)
Next
lv.MultiSelect = False
'lv.ContextMenu = mnuContextMenu 'Don`t need to add if done this way
lv.FullRowSelect = True 'Added this but, you don`t need it if you don`t want it
mnuItemHide.Text = "&Hide"
mnuItemExit.Text = "&Exit"
mnuContextMenu.MenuItems.Add(mnuItemHide)
mnuContextMenu.MenuItems.Add(mnuItemExit)
AddHandler mnuItemHide.Click, AddressOf Me.menuItem1_Click
End Sub
Private Sub lv_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lv.MouseDown
If e.Button = Windows.Forms.MouseButtons.Right Then
If lv.GetItemAt(e.X, e.Y) IsNot Nothing Then
lv.GetItemAt(e.X, e.Y).Selected = True
mnuContextMenu.Show(lv, New Point(e.X, e.Y))
mnuItemExit.Visible = True
mnuItemHide.Visible = True
End If
End If
End Sub
Private Sub menuItem1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim txtValue as String
txtValue = lv.FocusedItem.SubItems(2).Text
Kill(txtValue)
Dim txtValue1 As String
txtValue1 = lv.FocusedItem.SubItems(0).Text
MessageBox.Show(txtValue1 + " has been hidden")
End Sub
End Class
this is my code
To hide your form -> form1.visible=false
To hide your form from taskbar -> form1.ShowinTaskbar=false
then go to the form1 keydown event and put this...
If e.Control And e.KeyCode = Keys.Q Then ' ---> activate with Ctrl-Q
form1.visible=true
End If