الحصول على قيمة الخلية داتاغريدفيف أثناء تحرير قيمته

StackOverflow https://stackoverflow.com/questions/877505

  •  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 للحصول على وظيفة المقصود. لأنه لا يوجد حدث يتعرض لهذا المعالج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top