Как я могу заставить клавишу Enter вести себя в Winforms DataGridViewTextBoxCell
как он делает в нормальном Winforms TextBox
(добавьте новую строку к тексту, вместо того, чтобы изменить текущую ячейку)?
Ну, я узнал, как решить проблему. Во-первых, создайте класс под названием 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
, и вы все будете настроить!
Это можно сделать, установив свойство 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 по-прежнему добавляет новую строку к редактируемому тексту.
Надеюсь, это поможет.