4

でカスタム編集コントロールをホストしています。DataGridViewこれは、記録のために でありTextBoxButton一緒にUserControlです。DataGridViewColumn新しい列とDataGridViewTextBoxCell新しいセルを継承しました。

通常のDataGridViewTextBoxCellでは、セルにフォーカスがあるときにキーを押すと、編集モードが開始され、入力した文字が に表示されますTextBoxEditingControl。ただし、継承したセルでは、キーを押しても値が渡されません。(実際には、現在のセル値を手動で渡す必要がありますInitializeEditingControl。そうしないと、何も表示されません。) したがって、入力した最初の文字 (編集モードを開始する文字) は失われます。

OnKeyPressOnKeyDown、およびを試しOnKeyUpましたDataGridViewCellが、呼び出されません。KeyEntersEditModeただし、呼び出されるように見えるのは、押されたキーをチェックしている場合のみであるため、ここから始めるのがよいでしょう。問題は、KeyEventArgs を に変換する方法になりますchar。これはアルファベットと数字の場合は些細なことですが、すべてのキーボードが同じように作られているわけではないため、他のキーの処理は面倒でよくても複雑です。これを自動的に行うコンバーター クラスがある場合は、教えてください。

他の誰かがこの問題に遭遇したか、または適切な回避策を見つけましたか?

注: この問題は、EditModeが のバリエーションに設定されている場合に適用されますEditOnKeystroke。に設定することEditOnEnterは私のプロジェクトの有効な回避策ですが、のデフォルトの動作もエミュレートしたいと思いますTextBoxEditingControl

4

4 に答える 4

1

ユーザー コントロールの KeyPreview を true に設定してみてください。次に、編集プロセスを開始するキーがユーザー コントロールに対してもキーダウンを発生させるかどうかを確認します。存在する場合は、テキスト コントロールが編集モードになると、その文字を保存して割り当てることができます。

于 2009-06-09T10:27:40.630 に答える
1

OnKeyPress私の解決策は、 customをオーバーライドすることUserControlです。

protected override void OnKeyPress(KeyPressEventArgs e)
{
  _textBox.Text = e.KeyChar.ToString();
  _textBox.SelectionStart = 1;
  _textBox.SelectionLength = 0;
  base.OnKeyPress(e);
}
于 2009-07-01T06:31:36.700 に答える
0

こんにちは今日、私は同じ問題を抱えていました。私の解決策は、CustomCell で KeyEntersEditMode をオーバーライドし、変換するアルゴリズムを配置するか、文字が編集コントロールに渡すのに有効かどうかを判断することです。次に、この値をプライベート変数として保存します。InitializeEditingControl メソッドをオーバーライドし、保存した値をコントロールの初期値として使用します。それを使用した後、後で何も使用しないように null に設定しました。


private string startString;
public override bool KeyEntersEditMode(KeyEventArgs e)
{
    var result = base.KeyEntersEditMode(e);
    if (e.KeyData == Keys.D1)
    {
        startString = "1";
    }
    return result;
}

public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
    if(startString != null)
    {
        initialFormattedValue = startString;
        startString = null;
    }
    base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
    var c = this.DataGridView.EditingControl as MyEditingControl;
    string initialFormattedValueStr = initialFormattedValue as string;
    if (initialFormattedValueStr == null)
    {
        c.Text = string.Empty;
    }
    else
    {
        c.Text = initialFormattedValueStr;
        c.SelectionStart = initialFormattedValueStr.Length;
    }

}
于 2011-01-31T12:59:25.980 に答える