单击列 headers 时显示 ListView 中的上下文菜单
ContextMenu in ListView shows up when clicking on column headers
我制作了一个 ListView 和一个右键单击 ListView 时弹出的 ContextMenu。问题是当右击 headers 时它也会弹出。我想让它做的是只在我右键单击一个项目时弹出。
我已经尝试过有关此特定问题的其他问题的答案,但它们对我不起作用。
这是我添加的ListView。菜单应该只显示在项目上。
这是我的代码:
public GUIMod CreateList
{
set
{
ListView1.Items.Clear();
bool latestCompatibleVersionAlreadyFound = false;
ListView1.Items.AddRange(AllVersions.Select(module =>
{
ListViewItem item = new ListViewItem();
if (module.IsCompatible(versionCriteria))
{
if (!latestCompatibleVersionAlreadyFound)
{
latestCompatibleVersionAlreadyFound = true;
item.BackColor = Color.Green;
item.ForeColor = Color.White;
}
else
{
item.BackColor = Color.LightGreen;
}
}
if (installedVersion != null && installedVersion.IsEqualTo(module.version))
{
item.Font = new Font(item.Font, FontStyle.Bold);
}
item.Text = module.version.ToString();
item.SubItems.Add(module.HighestCompatibleVersion());
return item;
}
).ToArray());
}
}
private void ListView1_MouseDown(object sender, MouseEventArgs e)
{
var item = ListView1.HitTest(e.X, e.Y).Item;
if (e.Button == MouseButtons.Right)
{
if (item != null)
{
// Show the right click menu
ContextMenuStrip1.Show(ListView1, new Point(e.X, e.Y));
if (installedVersion != null && AllVersions[item.Index].version.IsEqualTo(installedVersion))
{
// Item is darkgreen, disable option
ToolstripMenuItem1.Enabled = false;
}
else if (!AllVersions[item.Index].IsCompatible(versionCriteria))
{
// Item is white, disable option
ToolstripMenuItem1.Enabled = false;
}
else
{
// Item is installable, enabe option
ToolstripMenuItem1.Enabled = true;
}
}
}
}
private void ToolstripMenuItem1_Click(object sender, EventArgs e)
{
// Nothing yet
}
MouseDown(我更喜欢用 mouseup 显示上下文菜单)事件有一个 MouseEventArgs 参数,其中 属性 是鼠标被点击的位置。这可以用来确定他的鼠标在哪里,即它是否在 header 中,如果是,则取消 mouseup evwnt。鼠标的位置可能是相对于列表框控件或窗体本身指定的,因此请检查并相应地调整逻辑(我不记得它使用的是哪个坐标系)
将 FullRowSelect
设置为 true
。然后处理 MouseClick
事件并检查是否单击了鼠标右键,执行命中测试,如果鼠标下方有项目,则首先 select 然后显示 ContextMenuStrip
这样:
private void listView1_MouseClick(object sender, MouseEventArgs e)
{
if(e.Button== MouseButtons.Right)
{
var hti = listView1.HitTest(e.Location);
if (hti.Item != null)
hti.Item.Selected = true;
contextMenuStrip1.Show(listView1, e.Location);
}
}
我制作了一个 ListView 和一个右键单击 ListView 时弹出的 ContextMenu。问题是当右击 headers 时它也会弹出。我想让它做的是只在我右键单击一个项目时弹出。
我已经尝试过有关此特定问题的其他问题的答案,但它们对我不起作用。
这是我添加的ListView。菜单应该只显示在项目上。
这是我的代码:
public GUIMod CreateList
{
set
{
ListView1.Items.Clear();
bool latestCompatibleVersionAlreadyFound = false;
ListView1.Items.AddRange(AllVersions.Select(module =>
{
ListViewItem item = new ListViewItem();
if (module.IsCompatible(versionCriteria))
{
if (!latestCompatibleVersionAlreadyFound)
{
latestCompatibleVersionAlreadyFound = true;
item.BackColor = Color.Green;
item.ForeColor = Color.White;
}
else
{
item.BackColor = Color.LightGreen;
}
}
if (installedVersion != null && installedVersion.IsEqualTo(module.version))
{
item.Font = new Font(item.Font, FontStyle.Bold);
}
item.Text = module.version.ToString();
item.SubItems.Add(module.HighestCompatibleVersion());
return item;
}
).ToArray());
}
}
private void ListView1_MouseDown(object sender, MouseEventArgs e)
{
var item = ListView1.HitTest(e.X, e.Y).Item;
if (e.Button == MouseButtons.Right)
{
if (item != null)
{
// Show the right click menu
ContextMenuStrip1.Show(ListView1, new Point(e.X, e.Y));
if (installedVersion != null && AllVersions[item.Index].version.IsEqualTo(installedVersion))
{
// Item is darkgreen, disable option
ToolstripMenuItem1.Enabled = false;
}
else if (!AllVersions[item.Index].IsCompatible(versionCriteria))
{
// Item is white, disable option
ToolstripMenuItem1.Enabled = false;
}
else
{
// Item is installable, enabe option
ToolstripMenuItem1.Enabled = true;
}
}
}
}
private void ToolstripMenuItem1_Click(object sender, EventArgs e)
{
// Nothing yet
}
MouseDown(我更喜欢用 mouseup 显示上下文菜单)事件有一个 MouseEventArgs 参数,其中 属性 是鼠标被点击的位置。这可以用来确定他的鼠标在哪里,即它是否在 header 中,如果是,则取消 mouseup evwnt。鼠标的位置可能是相对于列表框控件或窗体本身指定的,因此请检查并相应地调整逻辑(我不记得它使用的是哪个坐标系)
将 FullRowSelect
设置为 true
。然后处理 MouseClick
事件并检查是否单击了鼠标右键,执行命中测试,如果鼠标下方有项目,则首先 select 然后显示 ContextMenuStrip
这样:
private void listView1_MouseClick(object sender, MouseEventArgs e)
{
if(e.Button== MouseButtons.Right)
{
var hti = listView1.HitTest(e.Location);
if (hti.Item != null)
hti.Item.Selected = true;
contextMenuStrip1.Show(listView1, e.Location);
}
}