3

問題の回避策として、KeyDown イベントを処理して、ユーザーが実際に入力した印刷可能な文字を取得する必要があると思います。

KeyDown は、プロパティ KeyCode、KeyData、KeyValue、Modifiers、Alt、Shift、Control を持つ KeyEventArgs オブジェクトを提供します。

私の最初の試みは、KeyCode を ASCII コードと見なすことだけでしたが、キーボードの KeyCode は 46、ピリオド (".") であるため、ユーザーが削除キーを入力するとピリオドを出力してしまいます。だから、私は私の論理が不十分であることを知っています。

(興味のある方のために説明すると、問題は、DataGridView のコントロール コレクションに独自のコンボボックスがあり、入力した一部の文字が KeyPress および TextChanged ComboBox イベントを生成しないことです。これらの文字には、Q、$、% が含まれます....

このコードは問題を再現します。フォーム アプリを生成し、ctor をこのコードに置き換えます。それを実行し、文字 Q を 2 つのコンボボックスに入力してみてください。

public partial class Form1 : Form
{
    ComboBox cmbInGrid;
    ComboBox cmbNotInGrid;
    DataGridView grid;

    public Form1()
    {
        InitializeComponent();

        grid = new DataGridView();

        cmbInGrid = new ComboBox();
        cmbNotInGrid = new ComboBox();

        cmbInGrid.Items.Add("a");
        cmbInGrid.Items.Add("b");
        cmbNotInGrid.Items.Add("c");
        cmbNotInGrid.Items.Add("d");

        this.Controls.Add(cmbNotInGrid);
        this.Controls.Add(grid);
        grid.Location = new Point(0, 100);
        this.grid.Controls.Add(cmbInGrid);
    }
4

4 に答える 4

3

多くのコントロールは、デフォルトのキー入力イベントをオーバーライドします。たとえば、Panelはデフォルトではまったく応答しません。単純なコントロールの場合は、次のことを試すことができます。

protected override bool IsInputKey(Keys keyData) {
    // This snippet informs .Net that arrow keys should be processed in the panel (which is strangely not standard).

    switch (keyData & Keys.KeyCode) {
        case Keys.Left:
            return true;
        case Keys.Right:
            return true;
        case Keys.Up:
            return true;
        case Keys.Down:
            return true;
    }
    return base.IsInputKey(keyData);

}

IsInputKey関数は、イベントを受信するキーをプログラムに指示します。明らかに特別な機能を持つキーをオーバーライドすると、奇妙な動作をする可能性がありますが、少し実験して、何が機能し、何が機能しないかを自分で確認してください。

現在、DataGridViewやComboBoxなどのより高度なコントロールの場合、キー処理はさらに複雑になる可能性があります。次のリソースは、問題を解決する方法についていくつかの指針を提供するはずです。

http://www.dotnet247.com/247reference/msgs/29/148332.aspx

または、このリソースで問題が解決する可能性があります。

http://dotnetperls.com/previewkeydown

于 2009-11-26T01:39:45.247 に答える
0

System.Text.Encoding.ASCIIおよびSystem.Text.Encoding.Defaultをご覧ください

于 2008-10-13T19:27:35.753 に答える
0

試す:

KeysConverter converter = new KeysConverter();
string key = converter.ConvertTo(e.KeyCode, typeof(string));

しかし、あなたが説明している動作は非常に奇妙です。そのような場合は KeyPress を取得する必要があります... 簡単な例 (KeyPreview = true で KeyPress イベントが処理されたフォームのみ) を実行して、何が得られるかを確認してください。また、フォームが表示されたときに言語バーを確認してください。おそらく、想定とは異なる入力方法があるかもしれません。

于 2008-10-13T19:52:26.377 に答える
0

そこに捨てるアイデアとして、DataGridViewキーボードイベントが子コントロールに到達する前にインターセプトしているように見える場合は、興味のあるキーボードイベントに独自のハンドラーをDataGridView、およびハンドラーメソッドで直接提供できますか( s)、(1)DataGridViewの通常のイベント処理を抑制する、および/または (2) 手動でイベントを子コントロールに渡しますか?

于 2008-10-14T13:25:11.367 に答える