What is the solution here?
Thanks!
4 Answers, 1 is accepted
there may be an easier way to do this, but this example will select the list item in the list before showing the context menu.
Designer File
namespace
RadListBoxes
{
partial
class
Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private
System.ComponentModel.IContainer components =
null
;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected
override
void
Dispose(
bool
disposing)
{
if
(disposing && (components !=
null
))
{
components.Dispose();
}
base
.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private
void
InitializeComponent()
{
Telerik.WinControls.UI.RadListDataItem radListDataItem1 =
new
Telerik.WinControls.UI.RadListDataItem();
Telerik.WinControls.UI.RadListDataItem radListDataItem2 =
new
Telerik.WinControls.UI.RadListDataItem();
this
.radListControl1 =
new
Telerik.WinControls.UI.RadListControl();
((System.ComponentModel.ISupportInitialize)(
this
.radListControl1)).BeginInit();
this
.SuspendLayout();
//
// radListControl1
//
this
.radListControl1.CaseSensitiveSort =
true
;
radListDataItem1.Text =
"ListItem 1"
;
radListDataItem1.TextWrap =
true
;
radListDataItem2.Text =
"ListItem 2"
;
radListDataItem2.TextWrap =
true
;
this
.radListControl1.Items.Add(radListDataItem1);
this
.radListControl1.Items.Add(radListDataItem2);
this
.radListControl1.Location =
new
System.Drawing.Point(12, 12);
this
.radListControl1.Name =
"radListControl1"
;
this
.radListControl1.Size =
new
System.Drawing.Size(160, 123);
this
.radListControl1.TabIndex = 0;
this
.radListControl1.Text =
"radListControl1"
;
this
.radListControl1.MouseDown +=
new
System.Windows.Forms.MouseEventHandler(
this
.radListControl1_MouseDown);
//
// Form1
//
this
.AutoScaleDimensions =
new
System.Drawing.SizeF(6F, 13F);
this
.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this
.ClientSize =
new
System.Drawing.Size(184, 180);
this
.Controls.Add(
this
.radListControl1);
this
.Name =
"Form1"
;
this
.Text =
"Form1"
;
((System.ComponentModel.ISupportInitialize)(
this
.radListControl1)).EndInit();
this
.ResumeLayout(
false
);
}
#endregion
private
Telerik.WinControls.UI.RadListControl radListControl1;
}
}
Form1.cs
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Linq;
using
System.Text;
using
System.Windows.Forms;
using
Telerik.WinControls;
using
Telerik.WinControls.UI;
using
Telerik.WinControls.RadControlSpy;
namespace
RadListBoxes
{
public
partial
class
Form1 : Form
{
private
ContextMenu m_MyMenu =
new
ContextMenu();
public
Form1()
{
InitializeComponent();
this
.radListControl1.ContextMenu = m_MyMenu;
m_MyMenu.Popup +=
new
System.EventHandler(
this
.PopUp);
}
private
void
PopUp(
object
sender, EventArgs e)
{
if
(
this
.radListControl1.Items.Count > 0)
{
m_MyMenu.MenuItems.Clear();
MenuItem meniItem =
new
MenuItem(
"Click Me"
);
meniItem.Click +=
new
System.EventHandler(
this
.MenuItemClicked);
m_MyMenu.MenuItems.Add(meniItem);
}
}
private
void
MenuItemClicked(
object
sender, EventArgs e)
{
MessageBox.Show(
"You clicked the ClickMe context menu item"
);
}
private
void
radListControl1_MouseDown(
object
sender, MouseEventArgs e)
{
if
(e.Button == System.Windows.Forms.MouseButtons.Right)
{
RadListVisualItem item = (RadListVisualItem)
this
.radListControl1.ElementTree.GetElementAtPoint(e.Location);
Int32 i = 0;
foreach
(RadListVisualItem vItem
in
item.Parent.Children)
{
if
(vItem == item)
{
break
;
}
i++;
}
this
.radListControl1.Items[i].Selected =
true
;
}
}
}
}
Hope that helps.
Richard
did this help? If so please remember to mark as answer. If you need further help please let me know
Richard
It helped, but it only works when the user doesnt scroll the listbox.
Thats how i fixed this problem, any better way?
RadListVisualItem item = (RadListVisualItem)(sender
as
RadListControl).ElementTree.GetElementAtPoint(e.Location);
foreach
(RadListDataItem lstItem
in
(sender as
RadListControl)
.Items)
{
if
(lstItem.VisualItem == item)
{
lstItem.Selected =
true
;
break
;
}
}
The problem was that the RadListVisualItem Parent.Children has a different count as the whole listbox, so the i++ didnt pick the correct item. So with stepping threw the whole ListBoxItems and checking the visualitem, it works as expected.
In the given example from previous post, replace the code in the radListControl1_MouseDown Event with this Code.
Thank you for sharing your solution with the community.
This control is virtualized and a few visual items are reused by many logical items - so your workaround is correct.
Peter
the Telerik team
Register for the Q2 2011 What's New Webinar Week. Mark your calendar for the week starting July 18th and book your seat for a walk through of all the exciting stuff we will ship with the new release!