2

私には非常に些細な要件があり、気が狂ってしまいます。WindowsフォームアプリケーションにDataGridViewがあります。これには、データバインドされた ComboBox 列が 1 つ含まれます。そのコンボボックスの DisplayMember プロパティと ValueMember プロパティを使用しています。

私の要件は、ComboBoxがドロップダウンリストにDisplayMembersのリストを表示する必要があることですが、ユーザーがそこから1つのアイテムを選択すると、そのDisplayMemberの一部をユーザーに表示されるコンボボックスセルに表示する必要があります。例えば。

私の表示メンバーリストは次のようになります。

「Cust1 - 顧客 1」 「Cust2 - 顧客 2」 「Cust3 - 顧客 3」

ユーザーが上記のリストからいずれかを選択すると (たとえば、ユーザーが「Cust2 - Customer 2」を選択したとします)、完全な DisplayMember テキストではなく、コンボボックスの列セルに値を「Cust2」のみとして表示する必要があります。

この DisplayMember リストは、それにバインドされたデータソースからの 2 つのフィールドの組み合わせです。つまり、最初の部分は CustomerCode フィールドを指し、2 番目の部分は顧客名を指します。ユーザーがドロップダウン リストから 1 つの項目を選択した後、ComboBox セルに CustomerCode のみを表示する必要があります。

これどうやってするの?または、異なる AutoCompleteCustomSource と表示メンバー値を持つ独自のコントロールを考え出す必要があります。私もそのアプローチと混同しています。

更新:誰も私の問題に対する解決策を思い付いていません。今、私はそのための報奨金を開始しています。また、誰かが同じ機能を実装する他の方法を提案してくれれば、それは素晴らしいことです.

私は自分のコントロールを思いつき、単純なコンボボックスで作業して、選択したドロップダウンリストとは異なる値を表示しようとしましたが、うまくいきませんでした. これを実装する他の方法はありますか?ヒントやコツは非常に高く評価されます。

@Anurag: これが私が使用したコードです。デザインモードでデータグリッドビューを作成しました。「DataGridViewComboBoxColumn」タイプの列を 1 つ作成し、CustomerColumn という名前を付けました。

デザイナー ファイルでは、次のようになります。

private System.Windows.Forms.DataGridViewComboBoxColumn CustomerColumn;

これは、データソースに使用したエンティティ クラスです。

 public class Customer
 {
    public int Id { get; set; }
    public string CustCode { get; set; }
    public string CustName { get; set; }
    public string NameWithCode { get; set; }// CustCode - CustName format
 }

フォーム ロード イベントでは、次のことを行っています。

  CustomerColumn.DataSource = GetCustomers();
  CustomerColumn.DisplayMember = "NameWithCode";
  CustomerColumn.ValueMember = "Id";
4

3 に答える 3

3

カスタムコントロールを使用してこれに対する独自のソリューションを実装したため、私は自分の質問に答えています。

このカスタム コントロールは、コンボ ボックスのドロップダウン ボタンのみが表示されるように、コンボ ボックスの上にテキスト ボックスを配置することによって作成されます。

これで、ユーザー コントロールから DataGridViewEditingControl を派生させて、datagridview にカスタム列を作成しました。

DataGridView をホストしているコントロールからドロップダウン リスト ソースを取得するプロパティを Usercontrol に追加しました。

EditingControlShowing イベントで、このプロパティを次のように設定しています。

private void dataGridView2_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
  if(dataGridView2.CurrentCell.ColumnIndex.Equals(0) && e.Control is UserControl1)
  {
    var uscontrol = e.Control as UserControl1;
    uscontrol.DropDownListSource = source;
  }
}

このドロップ ダウン リスト ソースは、以下のように、オートコンプリート ソースをテキスト ボックスに、データ ソースをコンボ ボックスに設定するためにユーザー コントロールで使用されます。これは、DataGridView のこの列に対して EditingControlShowing イベントが発生するたびに、このソースがユーザー コントロールのテキスト ボックスとコンボ ボックスに対して更新されるようにするためです。

private void DropDownSourceChanged(object sender, EventArgs eventArgs)
{
  textBox1.AutoCompleteCustomSource = DropDownListSource;
  textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
  textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;

  comboBox1.DataSource = DropDownListSource;
}

ユーザーがテキストボックスのオートコンプリートソースに入力を開始すると、「NameWithCode」値を含むドロップダウンリストが表示され、ユーザーがそれらのいずれかを選択すると、ユーザーコントロールでオーバーライドされたテキストプロパティに設定されます。 DataGridView. Textbox テキスト (NameWithCode) に基づいて、コード部分を取得し、それを text プロパティに設定できます。ユーザーがコンボボックスのドロップダウンボタンを使用してアイテムを選択すると、コンボボックスで選択されたテキストを取得し、最終的に値を取得するためにセルで使用される Textbox に設定します。

このようにして、私が望む解決策を達成することができました。

@Homam、ソリューションも機能しますが、ComboBox の DropDownStyle を変更して、ユーザーがコンボボックスに値を入力できるようにすると、奇妙な動作をして、要件のマーク ソリューションに到達しません。したがって、このソリューションを使用しました。

于 2010-10-27T13:12:32.570 に答える
2

これが完全な解決策ではないことはわかっていますが、より良い解決策を探しましたが見つからなかったので、回避策に行きました

私は次のことをしました:

  1. ユーザーが を開いたときにComboBox、 を に変更DisplayMemberします"NameWithCode"

  2. ユーザーがそれを閉じると、私はそれをに戻します"CustCode"

DataGridView のDataGridView.EditingControlShowingイベントでComboBoxコントロールにアクセスできます。

コード:

private void dataGridView1_EditingControlShowing(object sender, 
    DataGridViewEditingControlShowingEventArgs e)
{
    var comboBox = e.Control as ComboBox;

    comboBox.DropDown += (s1, e1) => comboBox.DisplayMember = "NameWithCode";

    comboBox.DropDownClosed += (s2, e2) =>
        {
            // save the last selected item to return it after 
            // reassign the Display Member
            var selectedItem = comboBox.SelectedItem; 

            comboBox.DisplayMember = "CustCode";
            comboBox.SelectedItem = selectedItem;
        };
}

注: で始まる必要がありDisplayMemberます"CustCode"

幸運を!

于 2010-10-26T22:59:02.153 に答える