2011-07-05 7 views
1

私はWPFを初めて使い、DataGridで簡単なアプリケーションを作成しようとしています。このアプリケーションは、WebServiceからEmployees DataSetを受け取り、データの表示と編集を許可する必要があります。 DataSetには、従業員(ID、名前、GenderId、PositionId)、性別(ID、名前)、および位置(ID、名前)の3つのテーブルがあります。 GenderId経由でGenderと、PositionIdを介してPositionsと接続しているEmployeesテーブル。 私はEmployees DataSetをウィンドウにドラッグし、項目を編集できるDataGridを取得しました。しかし、これにはPositionとGenderのIDが含まれています。利用可能な値からGenderまたはPositionを選択してDataSetに保存できるようにするComboBoxesが必要です。 私は次のようにDataSetを読み込む:WPF Datagrid with comboboxesとDataSetからのロード

EmployeesProxy.EmployeesServiceClient proxy = new EmployeesProxy.EmployeesServiceClient(); 
     proxy.ClientCredentials.UserName.UserName = "user1"; 
     proxy.ClientCredentials.UserName.Password = "pass1"; 
     empDataSet = proxy.GetEmployeesData(); 
     employeesDataGrid.ItemsSource = empDataSet.Employees.DefaultView; 
     GenderDT = empDataSet.Gender; 

     proxy.Close(); 

私は私の窓のプロパティとしてempDataSetとGenderDTを持っています。 しかし、データを編集できるコンボボックスでXAMLに列を作成できませんでした。これを行う方法はありますか?

編集:私は(私が編集モードで性別を選択することができますが、通常モードで性別の名前を表示することができない、私はIDのみを参照してください)、部分的に動作します。この解決策を見つけた:

<DataGridTemplateColumn Header="Gender"> 
       <DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding Path=GenderDT, 
               RelativeSource={RelativeSource FindAncestor, 
               AncestorType={x:Type Window}}}" 
            DisplayMemberPath="Name" 
            SelectedValuePath="Gender" SelectionChanged="ComboBox_SelectionChanged" Loaded="ComboBox_Loaded"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellEditingTemplate>      
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Path=GenderId}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate>      
      </DataGridTemplateColumn> 

コンボボックスを変更した後、私は変更性別の列:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     ((DataRowView)employeesDataGrid.SelectedItem).Row["GenderId"] = ((DataRowView)((ComboBox)sender).SelectedItem).Row["Id"]; 
    } 

しかし、私にとっては、これは良いことではありません。そして、私はまだ望みの結果を得ていません。私はそのような仕事をする簡単な方法があると思った。私は同じ問題を抱えているし、解決策を見つけた

<DataGridTemplateColumn > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ComboBox > 
           .... 
          </ComboBox> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 

答えて

0

次のようなものでDataGridTemplateColumnを使用することができます。これが誰かを助けることを願っています。 まず、データのマスタテーブル(あなたのケースでは、従業員)にデータグリッドをバインドしています

myDataGrid.ItemsSource = dataset.Employees.DefaultView; 

は、次にデータグリッドにコンボを追加し、例えば名前、与える:positionComboを。そして、あなたはXAMLでいくつかのプロパティを指定する必要が関連テーブルにその後

positionCombo.ItemsSource = dataset.Positions.DefaultView; 

をコンボ(positionCombo)をデータにバインドしています

<DataGrid x:Name="myDataGrid" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridComboBoxColumn x:Name="positionCombo" Header="Position" DisplayMemberPath="Name" SelectedValuePath="Id" SelectedValueBinding="{Binding PositionId}"/> 
    </DataGrid.Columns> 
</DataGrid> 

注意(名前、ID)がフィールドであることをあなたの "ポジション"テーブルで "ポジションID"は "従業員"テーブルのFKです。

+0

ええ、私はこのようなことをしていますが、私はそれを働かせることができません:(。私のコードを見て、私は質問を更新しました – MyUserName

2

+1

私は最初の議決権を、 – jonrsharpe

+1

それは共有の美しさです。あなたの答えが誰かの日に保存されているのを見て本当にうれしいです。あなたのコメントにしばらく後に戻ってきました。 –