その値が編集されている間、DataGridViewのセルの値にアクセスします

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

  •  22-08-2019
  •  | 
  •  

質問

私はDataGridViewのでフォームを持っており、/ <ユーザーは最初の行の最初のセルに値を入力する起動したときも、その値を提出し、F2キーを押すことができますが、私は、ユーザーがタブをヒットしない限り、セル値にアクセスし、別のセルに移動カントP>

以下は、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のがnullを返す

役に立ちましたか?

解決 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;
        }
    }

他のヒント

どのように代わりにこのような何かをやっについて。 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 /ライブラリ/ system.windows.forms.datagridviewcell.onkeydown.aspxする

しかし、唯一の問題は、あなたが意図した機能を得るためにDataGridViewTextBoxCellのもと、独自のカスタムセルを作成する必要があるとしているということです。このハンドラのために露出イベントがないので。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top