【问题标题】:ADGV C# DataGridView - programatically call CellLeave EventADGV C# DataGridView - 以编程方式调用 CellLeave 事件
【发布时间】:2017-10-03 20:07:17
【问题描述】:

我正在尝试使用自动生成的 advancedDataGrid - ADGV (adgv.codeplex.com)。 当前问题与之前解决的问题类似:my previous stackoverflow.com question

我有一个带有高级数据网格的表单 (frmLev),其中填充了来自 SQL 的数据。 DataGridView 的一列是一个日期字段 (DD.MM.YYYY),其中放置了 DateTimePicker。

如果我做对了...问题在于只有当单元格编辑手动完成用户在 DatePicker 中选择日期时,整行才会保存到 SQL。单元格看起来像是编辑完成了,但必须通过单击、按 Enter 或 Tab 再次确认。其他文本单元格被选中的文本或闪烁的光标。

我想在 delDatePick_textChange() 的末尾将行保存到 SQL,但此时调用 currentRowSave() 将不起作用。用户必须先执行点击。只有 levDGV_CellLeave() 得到事件时才会保存数据。

问题是:如何以编程方式触发 CellLeave 事件?

MetroFramework.Controls.MetroDateTime delDatePick = new MetroFramework.Controls.MetroDateTime();
Rectangle _Rectangle; 


    private void frmLev_Load(object sender, EventArgs e)
    {
        //Add DateTimePicker to Date
            levDGV.Controls.Add(delDatePick);
            delDatePick.Visible = false;
            delDatePick.Format = DateTimePickerFormat.Short;
            delDatePick.TextChanged += new EventHandler(delDatePick_textChange);
            delDatePickValueAutomatic = false;
    }

private void levDGV_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        switch (levDGV.Columns[e.ColumnIndex].HeaderText)
        {
            case "Datum":
            _Rectangle = levDGV.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
            delDatePick.Size = new Size(_Rectangle.Width, _Rectangle.Height);
            delDatePick.Location = new Point(_Rectangle.X, _Rectangle.Y);
            delDatePick.Visible = true;
                if (levDGV.CurrentCell.Value != DBNull.Value)
                {
                    delDatePick.Value = (DateTime)levDGV.CurrentCell.Value;
                    delDatePickValueAutomatic = true;
                }
            break;
        }
    }

private void delDatePick_textChange(object sender, EventArgs e)
    {
        if (delDatePickValueAutomatic != false) // event fired when cell gets focused, so skipping
        {
            String pickedDate = delDatePick.Text.ToString();
            delDatePick.Visible = false;

            this.BeginInvoke((MethodInvoker)delegate ()
            {levDGV.CurrentCell.Value = pickedDate;});
            levDGV.Refresh();
            delDatePick.Visible = false;
            //I want to update SQL row here, but calling currentRowSave() will not work at this moment because row is in edit mode...
        }
    }

private void levDGV_CellLeave(object sender, DataGridViewCellEventArgs e)
    {
        //skipping first entrance;
        if (e.ColumnIndex != 0 && e.RowIndex != 0)
        {
            delDatePick.Visible = false;
            currentRowSave();
        }
    }

private void currentRowSave()
    {
        int rowIdx = levDGV.CurrentCell.RowIndex;
        DataRowView drv = (DataRowView)levDGV.Rows[rowIdx].DataBoundItem;
        DataRow dr = drv.Row;
        BeginInvoke((Action)(() => SaveRowChanges(dr)));
    }

【问题讨论】:

  • 你可以正常调用该方法,你所要做的就是创建一个DataGridViewCellEventArgs并填充它。
  • 添加了 levDGV_CellLeave(levDGV, new DataGridViewCellEventArgs(1, levDGV.CurrentCell.RowIndex)); - 方法正在触发,但单元格仍处于编辑模式...

标签: c# sql datagridview datepicker event-handling


【解决方案1】:

您也可以调用单元格的 EndEdit() 方法。像这样的:

this.BeginInvoke((Action)(() => levDGV.CurrentCell.EndEdit()));

【讨论】:

    【解决方案2】:

    找到了解决方法...它不能回答我的问题,但对我有用。

    this.BindingContext[levDGV.DataSource].EndCurrentEdit(); //does not call CellLeave
    currentRowSave();
    

    【讨论】:

    • 在网格的 CellClick 上取消隐藏日历控件的缺点是它只响应鼠标点击。还有其他方法可以开始单元格编辑,例如 F2。让您自己的自定义 DataGridViewColumn 派生通常是更好的主意。基本上,您想要的是:docs.microsoft.com/en-us/dotnet/framework/winforms/controls/… 然后,您可以在网格的 CellEndEdit 处理程序中进行数据库更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2010-10-04
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多