доступ к значению ячейки Datagridview во время редактирования ее значения
-
22-08-2019 - |
Вопрос
У меня есть форма с datagridview, и когда пользователь начинает вводить значение для первой ячейки в первой строке , я также могу нажать клавишу f2, которая отправляет это значение, но я не могу получить доступ к значению ячейки, если пользователь не нажмет tab и не перейдет в другую ячейку
ниже приведен мой код для доступа к значению ячейки при нажатии клавиши f2
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
var key = new KeyEventArgs(keyData);
ShortcutKey(this, key);
return base.ProcessCmdKey(ref msg, keyData);
}
protected virtual void ShortcutKey(object sender, KeyEventArgs key)
{
switch (key.KeyCode)
{
case Keys.F2:
MessageBox.Show(dataGridView1.SelectedCells[0].Value.ToString());
break;
}
}
dataGridView1.Выбранные ячейки[0].Значение возвращает null
Решение 2
@BFree спасибо, ваш код вдохновил меня ;) почему бы просто не вызвать this.dataGridView1.EndEdit();перед MessageBox.Показать(dataGridView1.Выбранные ячейки[0].Значение.toString());
этот код работает просто отлично :
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
var key = new KeyEventArgs(keyData);
ShortcutKey(this, key);
return base.ProcessCmdKey(ref msg, keyData);
}
protected virtual void ShortcutKey(object sender, KeyEventArgs key)
{
switch (key.KeyCode)
{
case Keys.F2:
dataGridView1.EndEdit();
MessageBox.Show(dataGridView1.SelectedCells[0].Value.ToString());
break;
}
}
Другие советы
Как насчет того, чтобы вместо этого сделать что-то подобное?Подключитесь к событию DataGridView "EditingControlShowing" и зафиксируйте там F2.Какой - то код:
public partial class Form1 : Form
{
private DataTable table;
public Form1()
{
InitializeComponent();
this.dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(HandleEditingControlShowing);
this.table = new DataTable();
table.Columns.Add("Column");
table.Rows.Add("Row 1");
this.dataGridView1.DataSource = table;
}
private void HandleEditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
var ctl = e.Control as DataGridViewTextBoxEditingControl;
if (ctl == null)
{
return;
}
ctl.KeyDown -= ctl_KeyDown;
ctl.KeyDown += new KeyEventHandler(ctl_KeyDown);
}
private void ctl_KeyDown(object sender, KeyEventArgs e)
{
var box = sender as TextBox;
if (box == null)
{
return;
}
if (e.KeyCode == Keys.F2)
{
this.dataGridView1.EndEdit();
MessageBox.Show(box.Text);
}
}
}
Идея проста, вы подключаетесь к событию EditingControlShowing .Каждый раз, когда ячейка переходит в режим редактирования, это срабатывает.Самое классное, что он предоставляет фактический базовый элемент управления, и вы можете применить его к фактическому элементу управления winforms и подключаться ко всем его событиям, как обычно.
Вы можете попробовать это
string str = dataGridView.CurrentCell.GetEditedFormattedValue
(dataGridView.CurrentCell.RowIndex, DataGridViewDataErrorContexts.Display)
.ToString();
Существует OnKeyDown
обработчик для DataGridViewCell
:
http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcell.onkeydown.aspx
Однако единственная проблема заключается в том, что вам придется создать свою собственную пользовательскую ячейку на основе DataGridViewTextBoxCell
чтобы получить предполагаемую функциональность.Потому что для этого обработчика нет события, открытого для этого обработчика.