ListView click event not triggered when clicking on empty areas - c#

I have a ListView control on my form. I have set its display mode to LargeImageList. I need to handle the items inside this control. So I have written code for its click event. But I see now that this event is not triggered when I click in an empty area inside it.
How can I make my ListView aware of the clicks on its area regardless.

To capture mouse clicks on the "white space" around the ListView items, you will need to use the MouseDown/MouseUp events.
This will also capture clicks to the items as well.

I've used the Global Mouse Hook for similar issues. You can use it to detect Mouse Clicks anywhere on the screen, then just check the click was within the listview control bounds.
Grab the code from Global Mouse Key Hook
IKeyboardMouseEvents m_GolbalHook = Hook.GlobalEvents();
m_GolbalHook.MouseClick += m_GolbalHook_MouseClick;
private void m_GolbalHook_MouseClick(object sender, MouseEventArgs e)
{
if (listView.Bounds.Contains(e.Location)) && (e.Button == System.Windows.Forms.MouseButtons.Left))
{
//Do Stuff
}
}

Related

Control.Capture is always true?

I have created a Windows Forms application, but I get strange behaviour from the Capture property of a control.
On a blank form, with a single label called "label1" and the code
public Form1()
{
InitializeComponent();
label1.MouseDown += pictureBox1_MouseDown;
}
void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
Debug.WriteLine(label1.Capture);
label1.Capture = !label1.Capture;
Debug.WriteLine(label1.Capture);
}
I observed, that the first WriteLine always says "True", the second one always says "False" when the button is clicked. Even when clicked multiple times.
The label never reacts to clicks outside its border, not even when I use label1.Capture = true instead.
Am I misunderstanding the expected behaviour of the "Capture" property? I expected the initial value to be false, and the label not to react to clicks outside, after the first click I expect the value to be true, and the label to react to all mouse clicks, even outside its borders.
In a MouseDown event, the Capture for the control always set to true initially. So normally if you perform a MouseDown and then without releasing mouse button move your mouse out of the control and then release mouse button, the MouseUp event of the control will be fired.
If you set Capture to false in MouseDown, then the mouse up event of your control will only fire if your mouse is over the control and if you move the mouse out of your control and then release mouse button, the MouseUp event of your control will not raise.
Also in MouseUp the capture will be released automatically.
For more information take a look at these resources:
WmMouseDown method source code
WmMouseUp method source code
CaptureInternal proprty source code
SetCapture documentations
ReleaseCapture documentations

WinForms Event Parent scroll

I have two FlowLayoutPanels on a form: PanelA and PanelB. Each will be populated at run-time with multiple controls, such that the panel will scroll (i.e AutoScroll is true).
Here's the issue: The controls that the panels are populated with each contain a ComboBox. Thus, MouseWheel events are consumed by the combo box instead of by the panel. I want MouseWheel events to be consumed by the panel.
If there's no scrollable control on the child controls, then the MouseWheel event skips the child control (which doesn't handle it) and hits the panel, which does handle it. How can I set my child control's combo box to ignore the MouseWheel event? Can I tell it to re-raise the event?
I tried just applying Focus to the Parent whenever one of the child controls ticks the 'MouseEnter' event; this fixed the scrolling issues, but also left the child controls completely un-editable.
Something else I've found from digging around involves fiddling with the Windows API directly, but I find it hard to believe that something like that is required for this.
I tested the following code and it seems like a solution to your issue. Basically you need to focus the 'FlowLayoutPanel' when you click on it, or your mouse enters it:
private void newCheckListQuestionPanel_Click(object sender, EventArgs e)
{
newCheckListQuestionPanel.Focus(); //allows the mouse wheel to work after the panel is clicked
}
private void newCheckListQuestionPanel_MouseEnter(object sender, EventArgs e)
{
newCheckListQuestionPanel.Focus(); //allows the mouse wheel to work after the panel has had the mouse move over it
}
Source

How to bypass the enter/leave event in c sharp

I'm having a Picture box in a user control window(Windows custom control library). and some functionality in the Form's Enter event and leave event.
Now my sample application is having two instances of the control. So when i run my sample application the fist control got selected and the enter event is triggered, and when i select the second control the first's leave and second's enter events are getting triggered.
Now, problem is that when i select(click) the second control's picturebox, the events are not triggering, i.e the control form is not getting the event.
So if i click whereever in the control(in the picturebox or in the control) the enter event should be triggered.
How to do this?
A picture box can't get focus. So clicking on it won't take the focus away from the previous control thus not triggering the events.
You need to add a click handler on the picture box in which you manually give focus to the associated focusable control.
private void PictureBox_Click(object sender, EventArgs e)
{
focusableControl.Focus();
}

SIngle and Double click events not working as expected in canvas

I have a Canvas which is present in a UserControl, I have attached the DoubleClick event to this UserControl like this
mainWindow.CanvasLayout.MouseDoubleClick +=
new MouseButtonEventHandler(CanvasLayout_MouseDoubleClick);
I am using this event handler to achieve full screen functionality.
Now, Canvas can have various controls placed inside it. Drag and drop functionality is implemented for these controls similar to this codeproject article.
Basically, I handle these events for a control -
this._dragSource.PreviewMouseLeftButtonDown +=
new MouseButtonEventHandler(DragSource_PreviewMouseLeftButtonDown);
this._dragSource.PreviewMouseMove +=
new System.Windows.Input.MouseEventHandler(DragSource_PreviewMouseMove);
this._dragSource.PreviewMouseLeftButtonUp +=
new MouseButtonEventHandler(DragSource_PreviewMouseLeftButtonUp);
Now, when user DoubleClicks on a control(present in canvas) both DoubleClick(Full Screen) and single Click(drag & drop) operations are performed, i.e. if user double clicks on control and change its mouse position quickly, control position is changed(its dragged and dropped to new position).
Is there any way I can prevent drag and drop operation when user double clicks on a control?
Got it, Instead of handling MouseDoubleClick event, I used PreviewMouseLeftButtonDown -
mainWindow.CanvasLayout.PreviewMouseLeftButtonDown
+= new MouseButtonEventHandler(CanvasLayout_PreviewMouseLeftButtonDown);
and
void CanvasLayout_PreviewMouseLeftButtonDown(object s, MouseButtonEventArgs e)
{
if (e.ClickCount > 1)
{
// Do double-click code
// Code for FullScreen
e.Handled = true;
}
}
What you need to do is, on mouse up start a timer the time should be retrieved from SystemInformation.DoubleClickTime, and do the click action on the timer tick (only if you didn't detect the double click in the mean time, obviously).
Likewise use SystemInformation.DragSize to prevent accidental drag&drop.
Note, the SystemInformation class is part of WinForms so you need to add a reference to System.Windows.Forms, this class will work just fine in WPF apps.

Handling mouse events

I am using windows forms. I have a problem in handling mouse events. In my application there is menu bar on top. In menu bar I have several toolstripmenu items. I want that when toolstripmenu item is highlighted, it shows some description in label. I am totally confused. What event I used to handle this problem. I used mouse enter, mouse move & mouse leave event but when mouse enters in the area of any menu item, its alright. The label shows some description when mouse enters or mouse move on the item. But when I move mouse on other area of form. The label remain shows the description about an item. I want that when mouse leaves the area of toolstripmenu item, the label goes blank. Help me to solve this problem
I use it for toolstripmenuitem. Mouse Enter & Mouse move event works fine but the main problem in mouse Leave event. When I move mouse on "open" option it shows description in label but when my mouse leave this option or leave the visible part of this option. The label description is same. Actually mouse leave event fires when any other control is in the focus after leaving "open" option. For Example I have menustrip & in menustrip I have several options. For Example First option is "Open" & I want that When mouse enters in visible part of "open" option its shows description in status bar lable "Open Files" & when my Mouse leave the visible part of "open" option, statusbarlabel goes blank but problem is that I can't understand properly when mouse leave event fires. Thanks for replying this question.
Here is my code. Take a look & tell me whats the problem?
private void openToolStripMenuItem_MouseEnter(object sender, EventArgs e)
{
label1.Text = "Open files";
}
private void openToolStripMenuItem_MouseLeave(object sender, EventArgs e)
{
label1.Text = "";
}
Use the MouseLeave event in your menuStrip and set the label text to "".
or use the same mouse event in your form and set the label text to " "..
I mean :
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
label1.Text = "";
}
you can use this solution if you want to show a text when the mouse is on the form.
Use the MouseLeave Event. In the same way you did MouseOver, when you catch a MouseLeave of your menu item, change the Label's Text property to "" (i.e. blank)

Categories