0

免責事項 - 私は C# を使用してまだ 1 週間ほどしか経っていないので、これが些細な質問ではないことを願っています。私は周りを見回しましたが、このスレッドの結果を含め、機能する解決策を見つけることができませんでした.

Windows フォームにコンボボックスがあります。コンボボックスのデータは、Access データベースから取り込まれます。私が設定した関連プロパティは次のとおりです - AutoCompleteMode = Append; AutoCompleteSource = ListItems; ドロップダウンスタイル = ドロップダウン. ユーザーはコンボボックスに入力でき、オートコンプリートできる必要があるため、DropDownList の DropDownStyle は機能しません。デフォルトのドロップダウン矢印を使用する代わりに、動的な PictureBox を使用しています。PictureBox をクリックするか、Enter イベントをトリガーすると、コンボボックスの DropDowned プロパティが true に設定されます。

現在のように、ユーザーはアイテムを問題なく選択するか、アイテムを入力してEnterキーを押すか、アイテムを入力してフィールドを離れることができます....これらのさまざまなタイプの対話のすべての間に、正しい値が何であるかを判断できますコンボボックスは。SelectedValue と表示されたテキストが常に同期していることを確認するための特定のトリガーがあります。

1つを除いて、考えられるすべての相互作用で正しい値を取得できます。ユーザーが文字列の入力を開始し (DropDowned プロパティ = true)、右矢印キーを押して文字列をオートコンプリートすると、コンボボックス内の文字列は常に null 文字列になります。

ビジュアル:

選択済み_テキスト

上記の文字列の太字のテキストは、コンボボックスで強調表示されたテキストです。ユーザーが右矢印キーを押して、コンボボックス内のテキストを次のようにすると、

Selected_Text

(この時点で DropDowned はまだ true であることに注意してください) ComboBox.Text 値は常に "" です。

ユーザーが Enter キーを押すと最初にトリガーされる ComboBoxes の DropDownClosed イベントの 1 つのコードを次に示します。

private void cmbxYear_DropDownClosed(object sender, EventArgs e)
    {
        try
        {
            if (!cmbxYear.Text.Equals(cmbxYear.SelectedValue.ToString()))
            {
                if (!bUpdated & !bErrorFound)
                {
                    validateData(cmbxYear, clrYear, false, imgFilter1, imgNoFilter1);
                    updateTable();
                }
            }
            imgFilter1.Visible = false;
            imgNoFilter1.Visible = true;
        }
        catch
        {
            imgNoFilter1.Visible = false;
            imgFilter1.Visible = true;
        }
    }

また、ComboBox.Text は、DropDowned プロパティ = true で、ユーザーが何かを入力してから "Enter" を押すと、常に null 文字列になることも発見しました。これは、DropDowned プロパティ = false の場合には当てはまりません。その場合、正しい文字列が返されます。

プログラムにコモボックス内のすべてのテキストを選択させることさえ試みました。ただし、SelectionLength に ComboBox.Text.Length より大きい値を指定しても機能しないようです。SelectedValue も参照してみました。ただし、SelectedValue は null です。

すべての集中的な目的のために、アプリケーションはコンボボックスにヌル文字列があると確信しています。

実際の文字列を取得するにはどうすればよいですか?


これが役立つ場合に備えて、次のイベントのコードがあります: Click、DataSourceChanged、DropDown、DropDownClosed、Enter、KeyDown、Leave、および Validated。

4

2 に答える 2

1

これはバグである可能性があります: Tab キーを押してドロップダウンを開いたままにすると、ComboBox の DropDownClosed イベント ハンドラーの SelectedItem が正しくない

私はそれがあなたの状況と同じではないことを知っています。回避策タブをチ​​ェックして、そこに投稿されたコードが役立つかどうかを確認してください。おそらく、正しいイベントを使用するだけの問題です。

イベント オーダーと一部の Windows フォーム コントロールの選択されたプロパティに関する私の経験は、あまり好ましいものではありませんでした。

于 2012-08-09T16:51:29.907 に答える
0

この明らかなバグに対する回避策を作成することができました。以下は私の回避策です。願わくば、このコードが他の人に役立つことを願っています。注: ComoBox のすべてのユーザー インタラクションを微調整するために、他のイベント ハンドラーを追加する必要がある場合がありますが、これは私の質問で説明した問題に対して機能します。

このコードを使用するには、フォームに cmbxTest という ComboBox が必要です。また、適切なイベント ハンドラーを追加する必要があります。以下で使用するように、フォーム名が frmMain であると仮定して、fmrMain.Designer.cs ファイルにこのコードを追加します (他の項目も必要になることに注意してください。ただし、これらはComboBox に追加する必要がある新しい項目 cmbxTest です。既にテスト フォーム (frmMain) にあるはずです):

this.cmbxTest.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Append;
this.cmbxTest.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.cmbxTest.DropDownClosed += new System.EventHandler(this.cmbxTest_DropDownClosed);
this.cmbxTest.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ComboBoxKeyUp);
this.cmbxTest.Text = "Test";  // Used in the below example - The default displayed text

フォームのクラス ファイル (この例では frmMain.cs) で、次のようにします。

public partial class frmMain : Form
{
    // Intial Declerations and initializations
    Boolean bReady = false;       // Secondary trigger for DataGridView selection
    string clrTest = "Test";      // Default display text - Clear filter text; Used to ignore the setting if this text is visible
    string currentText;           // Comboboxes' currently displayed text

    // Form execution
    public frmMain()
    {
        InitializeComponent();
    }

    // Some code...

    //
    // ComboBoxes on KeyPress event
    //      - Used as a workaround for MS ComboBoxes not updating their text correctly
    //      - Shared across all ComboBoxes (as applied by the individual controls' event handlers)
    //
    private void ComboBoxKeyUp(object sender, KeyEventArgs e)
    {
        ComboBox cmb = (ComboBox)sender;
        currentText = cmb.Text;
    }

    // Any trigger you want that requires the ComboBoxes text
    private void cmbxTest_DropDownClosed(object sender, EventArgs e)
    {
        if (!cmbxTest.Text.Equals(clrTest))
        {
            cmbxTest.Text = currentText;
        }
        // Do any other code that requires the cmbxTest.Text
        Console.WriteLine(cmbxTest.Text);
    }
}
于 2012-08-09T19:04:15.440 に答える