簡體   English   中英

ADGV C#DataGridView-以編程方式調用CellLeave事件

[英]ADGV C# DataGridView - programatically call CellLeave Event

我正在嘗試使用自動生成的advancedDataGrid-ADGV( adgv.codeplex.com )。 當前問題與之前解決的問題類似: 我之前的stackoverflow.com問題

我有一個帶有AdvancedDataGrid的表格(frmLev),其中填充了來自SQL的數據。 DataGridView的一列是日期字段(DD.MM.YYYY),其中放置了DateTimePicker。

如果我得到它的權利......問題是在全行會保存到SQL只有當單元格編輯完成后用戶在挑選中的DatePicker日期之后手動。 該單元格看起來編輯已完成,但是必須通過單擊,按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)));
    }

您還可以調用單元格的EndEdit()方法。 像這樣:

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

找到了解決方法...它不能回答我的問題,但是對我有用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM