DataGridView: Как я могу заставить клавишу Enter добавить новую строку вместо того, чтобы изменить текущую ячейку?

Как я могу заставить клавишу Enter вести себя в Winforms DataGridViewTextBoxCell как он делает в нормальном Winforms TextBox (добавьте новую строку к тексту, вместо того, чтобы изменить текущую ячейку)?

9
задан Zach Johnson 9 January 2010 в 22:09
поделиться

2 ответа

Ну, я узнал, как решить проблему. Во-первых, создайте класс под названием CustomDatagridviewTextBoxEditingControl , который происходит из datagridviewTextBoxEditingControl , и переопределить EditingControlwantInPutkey Как это:

public class CustomDataGridViewTextBoxEditingControl : DataGridViewTextBoxEditingControl
    {
        public override bool EditingControlWantsInputKey(
        Keys keyData, 
        bool dataGridViewWantsInputKey)
        {
            switch (keyData & Keys.KeyCode)
            {
                case Keys.Enter:
                    // Don't let the DataGridView handle the Enter key.
                    return true;
                default:
                    break;
            }

            return base.EditingControlWantsInputKey(keyData, dataGridViewWantsInputKey);
    }
}

Это останавливает DataGridView Вручение клавиши ввода и изменение текущей ячейки. Это, однако, не делает ключ ввода, добавьте новую строку. (Похоже, что DataGridViewTextBoxEditingControl удалил функциональность клавиши ввода). Следовательно, нам нужно переопределить lekeydown и реализовать функциональные возможности себя, как это:

protected override void OnKeyDown(KeyEventArgs e)
{
    switch (e.KeyCode & Keys.KeyCode)
    {
        case Keys.Enter:
            int oldSelectionStart = this.SelectionStart;
            string currentText = this.Text;

            this.Text = String.Format("{0}{1}{2}",
                currentText.Substring(0, this.SelectionStart),
                Environment.NewLine,
                currentText.Substring(this.SelectionStart + this.SelectionLength));

            this.SelectionStart = oldSelectionStart + Environment.NewLine.Length;
            break;
        default:
            break;
    }

    base.OnKeyDown(e);
}

, создайте класс под названием CustomDatAgridViewTextBoxCell , который происходит из DataGridviewTextBoxCell , а также Переопределить свойство Edittype для возврата типа customdatataGridViewTextBoxEditingControl .

public class CustomDataGridViewTextBoxCell : DataGridViewTextBoxCell
{
    public override Type EditType
    {
        get
        {
            return typeof(CustomDataGridViewTextBoxEditingControl);
        }
    }
}

После этого вы сделаете это, вы можете установить SecondEmplate свойство на существующем столбце к CustomdatataGridViewTextBoxCell , или вы можете создать класс, полученный из DataGridViewColumn CellTemplate Предустановлено на CustomDatatridviewTextBoxCell , и вы все будете настроить!

10
ответ дан 4 December 2019 в 13:47
поделиться

Это можно сделать, установив свойство DataGridViewCellStyle.WrapMode в true. Из MSDN:

If WrapMode is False для ячейки, которая содержит текст, в ячейке отображается текст в одну строку, и дисплеи любые встроенные символы новой строки в виде поля персонажи. Если режим WrapMode истинен для ячейка, содержащая текст, ячейка отображает символы новой строки в виде строки ломает, но и обертывает любые линии, которые превышать ширину ячейки.

Это можно установить для определенных ячеек, получив доступ к свойству Style на ячейке, или для всех ячеек в столбце, используя для столбца DefaultCellStyle.

[Обновление] Чтобы отключить клавишу Enter выборочно в DataGridView, добавьте фильтр сообщений в форму, содержащую DataGridView, как показано ниже:

private KeyMessageFilter m_filter = null;

private void Form1_Load(object sender, EventArgs e)
{
    m_filter = new KeyMessageFilter(this); 
    Application.AddMessageFilter(m_filter);

}

Вот класс фильтра сообщений:

public class KeyMessageFilter : IMessageFilter
{
    private Form m_target = null;

    public KeyMessageFilter(Form targetForm)
    {
        m_target = targetForm;
    }

    private const int WM_KEYDOWN = 0x0100;

    private const int WM_KEYUP = 0x0101;


    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_KEYDOWN)
        {
            //Note this ensures Enter is only filtered if in the 
            // DataGridViewTextBoxEditingControl and Shift is not also  pressed.
            if (m_target.ActiveControl != null && 
                m_target.ActiveControl is DataGridViewTextBoxEditingControl && 
                (Keys)m.WParam == Keys.Enter && 
                (Control.ModifierKeys & Keys.Shift) != Keys.Shift)
            {
                return true;
            }

        }

        return false;
    }
}

Теперь клавиша Enter отключается при редактировании текста, и для перехода в следующую ячейку необходимо нажать клавишу табуляции. Shift + Enter по-прежнему добавляет новую строку к редактируемому тексту.

Надеюсь, это поможет.

5
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: