الحصول على قيمة الخلية داتاغريدفيف أثناء تحرير قيمته
-
22-08-2019 - |
سؤال
ولدي نموذج مع داتاغريدفيف وعندما مستخدم بدء دخول قيمة الخلية الأولى في الصف الأول،، ويمكن أيضا الضغط على F2 التي تقدم تلك القيمة، ولكن أنا غير قادر على الوصول إلى قيمة الخلية إلا إذا ضرب المستعمل التبويب والذهاب إلى خلية أخرى
وفيما يلي قانون بلدي للوصول إلى قيمة الخلية عندما يتم ضرب 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.SelectedCells [0] .Value يعود لاغية
المحلول 2
وBFree بفضل التعليمات البرمجية أوحت لي؛) لماذا لا يدعو this.dataGridView1.EndEdit ()؛ قبل MessageBox.Show (dataGridView1.SelectedCells [0] .Value.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;
}
}
نصائح أخرى
وماذا عن القيام بشيء من هذا القبيل بدلا من ذلك. ربط في الحدث "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 كوم / EN-US / مكتبة / system.windows.forms.datagridviewcell.onkeydown.aspx
ولكن المشكلة الوحيدة هي أنك ستكون لدينا لإنشاء خلية المخصصة الخاصة بك على أساس من DataGridViewTextBoxCell
للحصول على وظيفة المقصود. لأنه لا يوجد حدث يتعرض لهذا المعالج.