- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想在右键单击 DataGridView 时放置一个上下文相关菜单。我想要从单击的单元格的内容中派生出一个菜单项,并从数据库中检索子菜单中的可变数量的项目。
我通过在 ContextMenuStrip Opening 事件中构建 ToolStripMenuItem 来实现这一点。它起作用了——几乎……
如果我不显示子菜单,这样用户必须单击顶层菜单中的单个项目,一切都很好,但是如果我调用 ShowDropDown 方法自动显示子菜单,则不会在项目出现时触发被点击。
这是我可以生成的最简单的代码来重现问题 - 我已经提取了对 DataGridView 和数据库的所有引用,因此我的“动态”菜单绝对是静态的;-)
如果您将其设为表单定义,请右键单击表单上的任意位置,您将看到有效但并非所需的行为 - 单击子菜单项并看到弹出窗口。勾选复选框并再次右键单击,您会看到子菜单自动飞出 - 但单击项目不会触发 aliasClick 处理程序。
有什么想法吗?在这个特定的应用程序中,我可以编写一个完全可维护的解决方法,避免使用 ShowDropDown - 但我想知道我做错了什么,以防将来需要使用它。
public partial class Form1 : Form
{
private ContextMenuStrip cms;
private CheckBox chkAuto;
public Form1()
{
InitializeComponent();
chkAuto = new CheckBox();
Controls.Add(chkAuto);
cms = new ContextMenuStrip();
cms.Opening += contextMenuStrip1_Opening;
this.MouseClick += Form1_MouseClick;
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
cms.Show(Cursor.Position);
}
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
cms.Items.Clear();
ToolStripMenuItem tsmi = new ToolStripMenuItem("Title from datagridviewcell");
tsmi.DropDownItems.Add(new ToolStripMenuItem("First item from database lookup", null, aliasClick));
tsmi.DropDownItems.Add(new ToolStripMenuItem("Second item from database lookup", null, aliasClick));
tsmi.DropDownItems.Add(new ToolStripMenuItem("Last item from database lookup", null, aliasClick));
cms.Items.Add(tsmi);
if (chkAuto.Checked)
tsmi.ShowDropDown();
e.Cancel = false;
}
private void aliasClick(object sender, EventArgs e)
{
ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender;
MessageBox.Show(clickedItem.Text);
}
}
最佳答案
我不完全确定如何着手证明这一点,但我怀疑您对 tsmi.ShowDropDown()
的调用以某种方式导致点击处理程序无法正确捕获坐标。将其替换为 cms.Show(MousePosition)
即可。
也许从坐标中收集到一些有用的信息...
var mi = new ToolStripMenuItem("First item from database lookup", null, aliasClick);
tsmi.DropDownItems.Add(mi);
var mi2 = new ToolStripMenuItem("Second item from database lookup", null, aliasClick);
tsmi.DropDownItems.Add(mi2);
var mi3 = new ToolStripMenuItem("Last item from database lookup", null, aliasClick);
tsmi.DropDownItems.Add(mi3);
cms.Items.Add(tsmi);
if (chkAuto.Checked)
tsmi.ShowDropDown();
//cms.Show(MousePosition);
Debug.WriteLine(mi.Bounds.ToString());
关于c# - ToolStripMenuItem ShowDropDown - 事件未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45029454/
我正在异步加载数据,我有一个 AutoCompleteTextView,当数据加载时,它在适配器中设置 当我单击搜索 View 时,我想向用户显示所有结果。我可以确认正在调用 onClickListe
我想在右键单击 DataGridView 时放置一个上下文相关菜单。我想要从单击的单元格的内容中派生出一个菜单项,并从数据库中检索子菜单中的可变数量的项目。 我通过在 ContextMenuStrip
所以我有一个自动完成 View ,当我键入时它会显示一个下拉菜单...但我希望在 Activity 开始时显示下拉菜单。所以我找到了这个 answer这表示使用 showDropDown() 应该有效
当我每次尝试动态更新 autoCompleteTextview ArrayAdapter 时,如果显示下拉列表,该下拉列表就会消失并且 showDropDown() 不起作用。 我的代码: @
我在 Google Play 管理中心收到了这个崩溃报告,这是我自己从未遇到过的。 java.lang.IllegalArgumentException: at android.widget.Li
我有两个 Activity , Activity 1 正在启动 Activity 2。在 Activity 2 中,我向 AutoCompleteTextView 注册了一个 OnFocusChang
我是一名优秀的程序员,十分优秀!