[.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 에서는 작동하지 않습니다.




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




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

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

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




Links