• 0

[C#] Problem with double-click on ListBox item


Question

Hi there,

I have a ListBox with a few items and at sometimes, when the ListBox only has a couple of items, you'll see a blank area after the last item because there are no more items to fill the ListBox.

Now, I've implemented the MouseDoubleClick event to get the index of the double-clicked item in the ListBox like this:

private void listNotes_MouseDoubleClick(object sender, MouseEventArgs e) {
	int noteIndex = listNotes.IndexFromPoint(e.Location);

	// DO SOMETHING ELSE...
}

However, if I double-click on that blank area, noteIndex will have the index value of the last item on the list.

I need to ignore this behavior. Any suggestions?

21 answers to this question

Recommended Posts

  • 0

You are right about something, SelectedIndex is much simpler. I don't know why I didn't use it in the first place... However, it does not solve the problem.

Double-clicking the blank area will return the index from the last item in the ListBox. Forget for a minute about the double-clicking, because that's not probably the problem. Let's say that event is not implemented, when you single-click any item in the ListBox, that item will be selected, but if you single-click on the blank area below the last item, that last item will be selected.

Conclusion, the last item is being selected when I click on the blank area, that's what I want to avoid...

  • 0
  Nazgulled said:
You are right about something, SelectedIndex is much simpler. I don't know why I didn't use it in the first place... However, it does not solve the problem.

Double-clicking the blank area will return the index from the last item in the ListBox. Forget for a minute about the double-clicking, because that's not probably the problem. Let's say that event is not implemented, when you single-click any item in the ListBox, that item will be selected, but if you single-click on the blank area below the last item, that last item will be selected.

Conclusion, the last item is being selected when I click on the blank area, that's what I want to avoid...

If I click the blank region in a listbox the last item is not selected and the selectedIndex returns -1. If there is a item selected from a previous single click then that selected index will be returned because it is the item selected, and the double click is based on clicking the listbox.

ways around would be to clear the Selected Items before you get the selectedIndex. make a copy of them before, and then re-assign them after you get the selectedIndex from the mouseClick.

That way, no interference from other events should be a problem.

  • 0

I don't understand what you are saying.

I cleared the selected items, clicked the blank area and the last item was selected...

One thing I haven't told you and maybe that's where is the problem... I'm using the KryptonListBox from the Krypton Toolkit, not the ListBox from Windows Forms. Maybe I should post this on the Krypton forums...

Thanks for all your help :)

  • 0
  Nazgulled said:
I don't understand what you are saying.

I cleared the selected items, clicked the blank area and the last item was selected...

One thing I haven't told you and maybe that's where is the problem... I'm using the KryptonListBox from the Krypton Toolkit, not the ListBox from Windows Forms. Maybe I should post this on the Krypton forums...

Thanks for all your help :)

From what I understand, you were saying that clicking a the blank area in the Listbox selects the last item. I can't recreate this behaviour using the 2008 Windows Forms version. Whether the Krypton one adds this is something to investigate.

The main problem I understand is that the double click event works, just that other event handlers and functions are getting in the way, such as single click, ect. To rectify this the only way I can think of would be to save the state of the object before the click, then clear down all selected properties, and just look at the one from the MouseEventArgs.

Then you can copy the data back in. That way, any items selected before the double click will be ignored. Of course this is catering for a very small number of possibilities..

  • 0

I don't really know what to say...

Please take a look at the attached solution. It's a very simple C# app with just the KryptonListBox. Open it, press F5 and click on the blank area. You'll see the last item getting selected...

WindowsFormsApplication1.zipFetching info...

  • 0
  Nazgulled said:
I don't really know what to say...

Please take a look at the attached solution. It's a very simple C# app with just the KryptonListBox. Open it, press F5 and click on the blank area. You'll see the last item getting selected...

Not played with C# for a while, but wouldn't you be able to hook into the ondoubleclick event on the items themselves, thus avoiding this issue?

  • 0
  DaveLegg said:
Not played with C# for a while, but wouldn't you be able to hook into the ondoubleclick event on the items themselves, thus avoiding this issue?

I tried to do this earlier but I don't its possible in C#. Played with the attached solution as well and can't really get anywhere with it.

  • 0

Oh its an custom made listbox. I played with it and the same happens so I changed "SelectionMode" to None and it works... and it doesnt. MouseDoubleClick event doesnt work only SelectedIndexChanged. I guess the creator of the control left some things out.

  • 0

I'm not sure what exactly is going on, but I tried a simple project with a listbox, a few items and subscribed to the MouseDoubleClick event, and this worked fine;

MessageBox.Show(listBox1.IndexFromPoint(e.Location).ToString());

Which is what you were using earlier, and it works on my machine. Regardless of previously selected items, if you double click in the extra space in the listbox (the area not occupied by a list item), it successfully returns -1 :s

  • 0

The author of Krypton Toolkit answered me with this:

  "Phil Wright" said:
I think the difference in behavior is because the Krypton list box is owner drawn and your standard one is not. But you can use code to work out the answer. Compare the returned item with the display rectangle of that item to ensure it really is under the mouse...

		private void kryptonListBox1_MouseDoubleClick(object sender, MouseEventArgs e)
		{
			int noteIndex = kryptonListBox1.IndexFromPoint(e.Location);
			if ((noteIndex >= 0) && (!kryptonListBox1.GetItemRectangle(noteIndex).Contains(e.Location)))
				noteIndex = -1;
		}

That would work for the MouseDoubleClick but I also have some buttons that perform actions on the selected listbox item. A single mouse click on the blank area also selects the last item. I also need to ignore this behavior... I've been trying a couple of things around the code above but haven't managed to do so, any ideas?

  • 0

I can override some if I created a class based on KryptonListBox, actually, already tried this but couldn't find a method that would help me with this problem, or I'm seeing how could I use that method to work around the problem...

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • The one thing people should pirate is the operating system. You can't get rid of it...
    • "prepare for mandatory Windows 11 upgrade" This is apparently some new use of the word "mandatory" with which until now I was not acquainted. What's the consequence for non-compliance? Microsoft whining incessantly at you? Trump will levy a tariff on you? Oh wait, that's what they're doing now.
    • Waste of money. Most of Africa is a 14th century sewer. South Africa use to be wealthy & doing well until they "kicked out" the ones running it.
    • Adobe releases all-new Photoshop app for Android devices by Pradeep Viswanathan Early this year, Adobe released an all-new Photoshop app for iOS devices. Designed from the ground up for smartphones, the app allows users to easily add, remove, adjust, and combine content, as well as access free Adobe Stock assets to create new visuals. Today, Adobe announced a similar, brand-new Photoshop app for Android devices, currently in beta. It’s important to note that this Android version is not intended to replace the desktop version of Photoshop. Instead, it offers access to select powerful Photoshop features—including layering, masking, and the new Generative Fill—within an easy-to-use mobile interface. During the beta phase, the following features are available to all users: Following the beta phase, users will need a new Photoshop Mobile & Web plan to access the premium features. The premium features list includes the ability to remove objects by brushing over them with the Remove Tool, the ability to use Clone Stamp to hide unwanted objects by cloning areas of an image, the ability to fill portions of an image with content sampled from other parts of the image with Content-Aware Fill, the ability to export using additional file formats (PSD, TIF, JPG, PNG), and more. You can download the Adobe Photoshop app from the Google Play Store if your device is running Android 11 or later and has at least 6GB of RAM (8GB or more is recommended for optimal performance).
    • And what about all the toxic waste that "clean" nuclear energy produces?
  • Recent Achievements

    • Conversation Starter
      DarkShrunken earned a badge
      Conversation Starter
    • One Month Later
      jrromero17 earned a badge
      One Month Later
    • Week One Done
      jrromero17 earned a badge
      Week One Done
    • Conversation Starter
      johnwin1 earned a badge
      Conversation Starter
    • One Month Later
      Marwin earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      245
    2. 2
      snowy owl
      156
    3. 3
      ATLien_0
      142
    4. 4
      +FloatingFatMan
      138
    5. 5
      Xenon
      129
  • Tell a friend

    Love Neowin? Tell a friend!