【发布时间】: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