ComboBox 列を持つデータグリッドにテーブルをバインドし、別のテーブルにバインドする TwoWay?
テーブルアカウントに双方向バインドされたデータグリッドがあります。更新ボタンがクリックされるたびに、テーブルを更新するデータ アダプターを更新します。それは正常に動作します。
ここで、Accounts テーブルに LocationCode という列があります。LocationCode の値は、別のテーブル Locations から取得されます。そのため、ユーザーがデータグリッドで LocationCode を変更する場合、ユーザーは、テーブル Locations の値のリストから LocationCode を選択できる必要があります。つまり、データグリッドでは、LocationCode 列は、DataContent がテーブル Locations である ComboBox 列である必要があります。
データグリッドにテーブル Accounts の値を表示する方法はありますか? ユーザーが Locations セルをクリックすると、コンボボックスが表示されるため、ユーザーはコンボボックスから選択できます。値が更新されると、データ アダプターを更新すると、テーブル Accounts が自動的に更新されますか (双方向バインディング)?
ここに私が今やっていることがあります:
<DataGrid AutoGenerateColumns="false" Name="dgActLoc" Grid.Row="0" IsReadOnly="false" FontWeight="Bold" Padding="5" Margin="5" ItemsSource="{Binding Path=., Mode=TwoWay}" SelectionMode="Single" FontSize="16" RowDetailsVisibilityMode="VisibleWhenSelected" PreparingCellForEdit="dgActLoc_PreparingCellForEdit">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=AcctLocID, Mode=TwoWay}" Header="Account Location ID" IsReadOnly="True" >
blah, blah
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=AccountID, Mode=TwoWay}" Header="Account ID" />
blah, blah
<DataGridComboBoxColumn Header="Location Code" Width="*" SelectedValueBinding="{Binding Path=LocationCode}" SelectedValuePath="LocationCode" DisplayMemberPath="LocationCode" >
</DataGridComboBoxColumn>
</DataGrid>
次に、コードビハインドで:
private void dgActLoc_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
if (e.Column.Header.Equals("Location Code"))
{
string cmd = "SELECT LocationCode FROM Location ORDER BY LocationCode";
DataTable dt = clsDataAccess.GetTableFromDB(cmd);
ComboBox cboEditingElement = (ComboBox)(e.EditingElement);
BindingOperations.SetBinding(cboEditingElement, ComboBox.ItemsSourceProperty, new Binding() { Source = dt });
}
}
ただし、問題があります。ウィンドウが表示されると、値が必要な場合でも列が空白になります (赤い円)。
セルをクリックすると、コンボボックスが表示され、値を選択できます。[更新] ボタンをクリックすると、テーブルの値が更新されます。
だから、私の質問は、なぜそれが空白なのか (最初のスクリーンショットで)、それを修正する方法は?
ありがとう