2011-02-07 33 views
0

カスケードコンボボックスを作成するためのコードです。セグメント名(combox1)に選択された値に基づいてFamily Combobox(ComboBox2)に値を設定しようとしています。最初のComboに静的リソースを設定することはできますが、 最初のコンボボックスの選択変更イベントで、 "FillComboBoxFamilyData(SegmentCode)"というメソッドを呼び出しています。カスケードコンボボックスを動作させることができません

XAMLコード:

<Grid Height="142" HorizontalAlignment="Left" Margin="49,113,0,0" Name="grid3"  VerticalAlignment="Top" Width="904"> 
       <ComboBox Height="23" HorizontalAlignment="Left" Margin="35,26,0,0" Name="comboBox1" VerticalAlignment="Top" Width="205" ItemsSource="{Binding Source={StaticResource tblSegmentViewSource}}" DisplayMemberPath="Segment Name" SelectedValuePath="Segment Code" SelectionChanged="comboBox1_SelectionChanged"/> 
       <ComboBox Height="23" HorizontalAlignment="Right" Margin="0,26,395,0" Name="comboBox2" VerticalAlignment="Top" Width="205" /> 


    <Window.Resources> 
    <CollectionViewSource x:Key="tblSegmentViewSource" Source="{Binding Path=TblSegment, Source={StaticResource brickDataset}}" /> 
    <CollectionViewSource x:Key="tblFamilyViewSource" Source="{Binding Path=TblFamily, Source={StaticResource brickDataset}}" /> 

* BrickDataSetは、私はからテーブルを引いています主なデータセットです。 *

のC#:

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     MessageBox.Show(comboBox1.SelectedValue.ToString()); 
     SegmentCode = Convert.ToInt32(comboBox1.SelectedValue.ToString()); 
     FillComboBoxFamilyData(SegmentCode); 
    } 

    public void FillComboBoxFamilyData(int Segment_Code) 
    { 
     string connString = 
      "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Documents and Settings\\dchaman\\My Documents\\PDRT.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True "; 

     SqlConnection con = new SqlConnection(connString); 
     con.Open(); 
     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = con; 
     cmd.CommandType = System.Data.CommandType.Text; 
     cmd.CommandText = 
      "SELECT TblFamily.[Family Name],TblFamily.[Family Code] FROM TblFamily WHERE (TblFamily.[Segment Code] = @SegmentCode)"; 

     cmd.Parameters.AddWithValue("@SegmentCode", Segment_Code); 

     DataSet objDs = new DataSet(); 
     SqlDataAdapter dAdapter = new SqlDataAdapter(); 
     dAdapter.SelectCommand = cmd; 
     dAdapter.Fill(objDs); 
     con.Close(); 
     if (objDs.Tables[0].Rows.Count > 0) 
     { 
      MessageBox.Show("Here I am"); 
      comboBox2.DataContext = objDs.Tables; 
      comboBox2.Items.Insert(0, "--Select Family Name--"); 
      comboBox2.DisplayMemberPath = "Family Name"; 
      comboBox2.SelectedValue = "Family Code"; 
     } 
    }  

私は右の私を保存now.Pleaseテーブルで私の頭を叩いています!

+0

メッセージボックスが表示されますが、コンボには情報がありません。私はあなたがコンボボックス2のDataContextを設定しているのを見るが、あなたはそのコンテキストに何もバインドしていない。 – Thomas

答えて

0

comboBox2のItemsSourceを設定していません。 DataContextは、すべてのバインディングステートメントに影響します。あなたの代わりにDataContextの正しいテーブルにItemsSourceを設定した場合、それが正しい道にあなたを取得する必要があります。

if (objDs.Tables[0].Rows.Count > 0) 
{ 
    MessageBox.Show("Here I am"); 
    comboBox2.ItemsSource = ((IListSource)objDs.Tables[0]).GetList(); // set the ItemsSource instead of the DataContext 
    comboBox2.DisplayMemberPath = "Family Name"; 
    comboBox2.SelectedValue = "Family Code"; 
} 

あなたがItemsSourceを設定すると、Itemsプロパティにテキストを挿入行が失敗することに注意してください、 ItemsSourceItemsを一緒に使用することはできません。

+0

返信いただきありがとうございます。どのようなテーブルを設定するのですか?ObjDsのデータセットを意味しますか? – MangoTable

+0

私はそれをあなたがあなたのDataSetで必要なテーブルに割り当てることを意味しました。あなたに例を挙げて答えを更新しました。 –

+0

ありがとう。ちょうど私が行う最初の行を表示します------ comboBox2.ItemsSource = objDs.Tables--; write-comboBox2.ItemsSource = objDs.Tables [0] ---;を実行すると例外がスローされます。例外は '明示的な変換が存在し、system.data.datatableをsystem.Collections.IEnumerableに変換できません' – MangoTable

関連する問題