【问题标题】:Interaction between ErrorText and ContextMenuStripErrorText 和 ContextMenuStrip 之间的交互
【发布时间】:2015-06-23 21:59:51
【问题描述】:

我的应用程序有一个带有 RowValidating 事件处理程序的 datagridview。如果我在 RowValidating 中设置ErrorText,它正确地禁止左键单击其他行和其他控件,但如果我将 ContextMenuStrip 分配给另一个控件,则 ContextMenuStrip 保持活动状态。用户可以右键单击带有上下文菜单的控件,选择一个菜单项,然后触发菜单事件。

我尝试了各种事件处理,但 RowValidating 事件在菜单出现之前不会触发,所以我不能只禁用 RowValidating 中的上下文菜单。每当用户触摸网格的任何部分时,我也许可以禁用上下文菜单,但这还有其他陷阱......

我查看过,但没有看到任何关于 Microsoft 缺陷或解决方法的现有文章,甚至没有看到任何其他遇到错误的人,所以我不确定我可能做错了什么。

简化示例:

 private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.dataGridView1 = new System.Windows.Forms.DataGridView();
        this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
        this.menuItemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
        this.textBox1 = new System.Windows.Forms.TextBox();
        this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
        ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
        this.contextMenuStrip1.SuspendLayout();
        this.SuspendLayout();
        this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
        this.Column1});
        this.dataGridView1.RowValidating += new System.Windows.Forms.DataGridViewCellCancelEventHandler(this.dataGridView1_RowValidating);
        this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
        this.menuItemToolStripMenuItem});
        this.menuItemToolStripMenuItem.Text = "Menu Item";
        this.textBox1.ContextMenuStrip = this.contextMenuStrip1;
        this.Controls.Add(this.textBox1);
        this.Controls.Add(this.dataGridView1);

        ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
        this.contextMenuStrip1.ResumeLayout(false);
        this.ResumeLayout(false);
        this.PerformLayout();

    }

    private System.Windows.Forms.DataGridView dataGridView1;
    private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
    private System.Windows.Forms.ToolStripMenuItem menuItemToolStripMenuItem;
    private System.Windows.Forms.TextBox textBox1;
    private System.Windows.Forms.DataGridViewTextBoxColumn Column1;


    private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
    {
        if (!RowValid(dataGridView1.Rows[e.RowIndex]))
        {
            dataGridView1.Rows[e.RowIndex].ErrorText = "Value must be 5";
            e.Cancel = true;
        }
        else
        {
            dataGridView1.Rows[e.RowIndex].ErrorText = string.Empty;
            e.Cancel = false;
        }
    }

    private bool RowValid(DataGridViewRow row)
    {
        return string.Equals(row.Cells[0].Value, "5");
    }

作为参考,这些是按顺序触发的事件,在菜单打开之前不会发生注释验证:

dataGridView1_Enter
dataGridView1_RowEnter
dataGridView1_CellEnter
dataGridView1_CellBeginEdit
contextMenuStrip1_Opening

【问题讨论】:

    标签: c# validation datagridview contextmenustrip


    【解决方案1】:

    处理ToolStripDropDown.Opening 事件,通过设置e.Cancel 确定上下文菜单是否应该显示。或者您可以禁用菜单项。

    【讨论】:

    • 仍然需要弄清楚如何确定上下文菜单是否应该显示。验证尚未发生,因此无法在那里设置标志。如果单击新行并且默认值无效,则 IsCurrentRowDirty 标志不处理。即使所有数据都有效,使用 RowEnter 和 RowLeave 设置标志也不允许显示菜单。玩了许多事件。
    猜你喜欢
    • 1970-01-01
    • 2012-01-16
    • 2012-09-06
    • 2016-11-11
    • 2016-05-15
    • 2015-03-31
    • 2014-06-28
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多