문제

DatagridView가있는 양식이 있고 사용자가 First Row에서 First Cell의 값을 입력하기 시작하면 해당 값을 제출하는 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 returns null

도움이 되었습니까?

해결책 2

@bfree 감사합니다 귀하의 코드는 저에게 영감을주었습니다.) 왜 이것을 호출하지 마십시오 .datagridView1.enderit (); 이전 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);
        }
    }

}

아이디어는 간단합니다. 편집 콘트로 보시 이벤트에 연결됩니다. 셀이 편집 모드로 들어갈 때마다 발사됩니다. 멋진 점은 실제 기본 제어를 노출시키고 실제 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 의도 된 기능을 얻기 위해. 이 핸들러에 노출 된 이벤트가 없기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top