[.net] DataGridView 데이터 셀에서 keypressed, keydown 이벤트를 얻는 방법


Answers

마침내 알아 냈어. 이 수수께끼에는 두 부분이 있습니다. 셀 편집 컨트롤에서 키를 가져와 DataGridView 자체에서 키를 가져 오는 것입니다. 여기 내 코드가있다. 그것을 사용하려면 사용자 정의 이벤트 인 keyPressHook 에 가입해야합니다.

class KeyPressAwareDataGridView : DataGridView
{

    protected override void OnControlAdded(ControlEventArgs e)
    {
        this.subscribeEvents(e.Control);
        base.OnControlAdded(e);
    }

    protected override void OnControlRemoved(ControlEventArgs e)
    {
        this.unsubscribeEvents(e.Control);
        base.OnControlRemoved(e);
    }

    protected override bool ProcessDataGridViewKey(KeyEventArgs e)
    {
        bool procesedInternally = false;

        if (this.keyPressHook != null)
        {
            this.keyPressHook(this, e);
            procesedInternally = e.SuppressKeyPress;
        }

        if (procesedInternally)
        {
            return true;
        }
        else
        {
            return base.ProcessDataGridViewKey(e);
        }
    }


    private void subscribeEvents(Control control)
    {
        control.KeyDown += new KeyEventHandler(this.control_KeyDown);
        control.ControlAdded += new ControlEventHandler(this.control_ControlAdded);
        control.ControlRemoved += new ControlEventHandler(this.control_ControlRemoved);

        foreach (Control innerControl in control.Controls)
        {
            this.subscribeEvents(innerControl);
        }
    }

    private void unsubscribeEvents(Control control)
    {
        control.KeyDown -= new KeyEventHandler(this.control_KeyDown);
        control.ControlAdded -= new ControlEventHandler(this.control_ControlAdded);
        control.ControlRemoved -= new ControlEventHandler(this.control_ControlRemoved);

        foreach (Control innerControl in control.Controls)
        {
            this.unsubscribeEvents(innerControl);
        }
    }

    private void control_ControlAdded(object sender, ControlEventArgs e)
    {
        this.subscribeEvents(e.Control);
    }

    private void control_ControlRemoved(object sender, ControlEventArgs e)
    {
        this.unsubscribeEvents(e.Control);
    }

    private void control_KeyDown(object sender, KeyEventArgs e)
    {
        if (this.keyPressHook != null)
        {
            this.keyPressHook(this, e);
        }
    }

    public event KeyEventHandler keyPressHook;

}
Question

DataGridView 컨트롤에서 셀 편집 중 키 누르기 이벤트를 수신해야합니다.

내가 그물에서 발견 한 것으로부터 DataGridViewDataGridView 에서 셀 편집 컨트롤로 모든 키 이벤트를 전달하도록 설계되었으므로 이러한 이벤트를 쉽게 얻을 수 없습니다.

DataGrid 컨트롤에 대한 이벤트를 트래핑하는 코드 조각을 발견했지만 DataGridView 에서는 작동하지 않습니다.




EditingControlShowing을 청취하고 각 새 편집 컨트롤에 키 리스너를 추가하여 부분적인 해결책을 찾았습니다.

이것은 대부분의 키에 대한 액세스를 제공하지만, 여전히 화살표 키를 얻지 못합니다.

Eren Aygunes가 제안한 것을 시험해 보겠습니다.




아마 위의 Mladen Prajdic의 대답만큼 좋지는 않지만 상황에 따라 약간 더 쉬울 수도 있습니다. 폼 또는 컨트롤 자체의 ProcessCmdKey 메서드를 재정의하고 키 입력을 처리하고 현재 셀을 확인할 수 있습니다.