• 締切済み

Visualbasic2010 WPF データ更新

VisualBasic 2010 を利用してWindowsアプリケーションを行っております。 Form上にElementHostを配置し、データベースより抽出した結果をWPFで作成したグリッド(DataGrid)に表示しております。 以下の点について分る方がいらっしゃいましたらご教授頂けますと幸いです。 DataGridでデータを更新した場合にDataTableも更新したい ソースは以下の構成となります。 ★Item_Main.xaml <UserControl x:Name="UserControl1" x:Class="Item_Main" xmlns:local="clr-namespace:TEST" mc:Ignorable="d" d:DesignHeight="200" d:DesignWidth="300" Height="Auto" Width="Auto" GotFocus="UserControl_GotFocus"> <DataGrid x:Name="DataGrid_1" ItemsSource="{Binding}" ScrollViewer.CanContentScroll="True" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Standard" ScrollViewer.IsDeferredScrollingEnabled="True" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" HeadersVisibility="None" Margin="0,0,0,0"> <DataGrid.Columns> <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <local:Item_Detail /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </UserControl> ★Item_Detail.xaml <UserControl x:Name="UserControl2" x:Class="Item_Detail" mc:Ignorable="d" d:DesignHeight="136" Width="1090" Loaded="UserControl_Loaded"> <UserControl.Background> <SolidColorBrush Color="{DynamicResource {x:Static SystemColors.WindowColorKey}}"/> </UserControl.Background> <Grid Name="GP_Panel" KeyboardNavigation.TabNavigation="Local"> <Grid.ColumnDefinitions> <ColumnDefinition Width="69*"/> <ColumnDefinition Width="151*"/> </Grid.ColumnDefinitions> <TextBox x:Name="Text_Pre_CS" Text="{Binding 数量, Mode=TwoWay, TargetNullValue=0}" HorizontalAlignment="Left" Height="22" Margin="161,102,0,12" TextWrapping="Wrap" Width="60" Background="White" FontFamily="Arial" HorizontalContentAlignment="Right" VerticalContentAlignment="Center" FontWeight="Bold" Foreground="Black" Grid.Column="1" TabIndex="1" FontSize="15" /> </Grid> </UserControl> ★Item_Detail.xaml.vb  ※現在はデータ編集時に以下のように処理しております。 '/ 本画面のDataRowを取得 Dim dt_row As DataRow Dim dt_row_view As DataRowView dt_row_view = CType(Me.DataContext, DataRowView) dt_row = dt_row_view.Row   dt_row.Item("数量") = "0" DataRowはDataTableとは異なると認識しておりますので   現在のロジックではDataTable側は更新されない事は   理解しているのですが、Item_Detail.xaml.vbにて   DataTableの特定行数を取得する方法等が分らず   目的の動作が実現できていません。   大変お手数おかけ致しますが、   宜しくお願い致します。 以上です。   

みんなの回答

  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.2

バインドがあるのだからそれで反映させるのが一番の方法だとは思いますし、そのためのバインドでもあると思います。 「※現在はデータ編集時~」とはどのイベントでしょうか。 そのタイミングで他のコントロールが参照できるのでしたら、DataTableに行番号を持たせておいて、それ用のTextBoxやLabelにバインドしておけば、その行番号を取得できそうな気もします。 そうしておいてDataTableから一致する行を検索して、その行を対象に処理する、かな。 Item_Detail側で現在行を取得するのは無理か難しいので、やるとしたら、DataGridのItem_Main側になると思います。 まず、DataGridに「SourceUpdated」イベントを追加します。 その内容はこんな感じです。 Dim grid = CType(sender, System.Windows.Controls.DataGrid) Dim ci = CType(grid.CurrentItem, DataRowView) Dim row = ci.Row row.Item("数量") = 0 次にItem_DetailのテキストボックスのBindingに以下を追加します。  ,NotifyOnSourceUpdated=True,UpdateSourceTrigger=LostFocus CurrentItemが現在の行の情報なので、そのRowに対して何かすればいいのですが、単純に「0」と言う固定値にすることは簡単にできても、ここからではItem_Detailのテキストボックスを簡単に参照できません。 更新イベントを参考にしたのはこちらです。 https://araramistudio.jimdo.com/2019/09/27/c-%E3%81%AEwpf%E3%81%A7datagrid%E3%81%AE%E5%80%A4%E3%81%8C%E6%9B%B4%E6%96%B0%E3%81%95%E3%82%8C%E3%81%9F%E6%99%82%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88/ ひとまず、WIndowsFormからいったんはなれて、WPFだけでデザインやプロパティは最低限にして試してみてはどうでしょうか。 私の方ではどちらで試してもバインドで反映されてしまうので、質問者さまと同じ状況でのテストができていません。

すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.1

テキストボックスのバインディングに 「,UpdateSourceTrigger=PropertyChanged」 を追加して、試してみてください。 <TextBox x:Name="Text_Pre_CS" Text="{Binding 数量, Mode=TwoWay, TargetNullValue=0,UpdateSourceTrigger=PropertyChanged}" 「PropertyChanged」はテキストボックスに文字を入力する都度反映されるのであまりいいタイミングではありません。例えば「100」と入力するとして、最初の「1」次の「0」さらに次の「0」で計3回データテーブルへの反映が発生します。 他には「LostFocus」があり、文字を入力する都度ではないものの、フォーカスが外れないと反映されないので、最後の入力決定のタイミングが他のコントロールに移動する必要があるのですが、WindowsForm側のボタンを押すとかでも大丈夫です。 もうひとつ「Explicit」と言うのがあるのですが、難しそうだったので試していません。

19820202
質問者

補足

ご教授頂きましてありがとうございます。 早速「UpdateSourceTrigger=PropertyChanged」を組み込んで検証してみたのですが、DataTableには反映しないようでした。 Item_Detail側でDataTableのカレント行番号が取得できれば処理できるのではないかと考えているのですが、そのような方法は難しいのでしょうか。

すると、全ての回答が全文表示されます。

関連するQ&A