locked
データベースから取得したデータを子画面のDataGridに表示して、GridRowを選択した時に値を取得する。 RRS feed

  • 質問

  • こんにちは、お世話になります。

    (稼働環境:SilverLight4, VisualStudio2010)

    只今、子画面のデータグリッドのデータを取得したいと考えています。ここで、取得したデータを親画面へ渡したいのですが、行き詰ってしまいました。データグリッドに表示するデータがWCFでデータベースから取得しています。 グリッドに表示は出来るのですが、表示させた値を取ることが出来ません。

    1.子画面をロードした際にデータベースのデータをデータグリッドに表示させるコード(表示は問題なく出来ます。)

    private void Grid_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
          ServiceClient webService = new ServiceClient();
          webService.GetDataCompleted += new
            EventHandler<GetDataCompletedEventArgs>(webService_GetDataCompleted);
          webService.GetDataAsync();
        }
        void webService_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
        {
          DataGrid.ItemsSource = e.Result; ←★
        }

    2.ここで★コードの下に、表示された値を取得するコードを書きました。この時点では、表示グリッドに表示させた値を取得出来ます。一度リストに入れて、取得します。 

     

    この後、私が実際にデータをデータグリッドより取得したいのは、データグリッドのSelectionChangedイベントが発生した時なのです。

    private void Dg_SelectionChanged(object sender, RoutedEventArgs e)
    {
       //ここにDataGrud.ItemSource = e.Resultで使用して、データグリッドに表示した値の中から選択行の値を取得するコードを書きたい。
    }

    3.そして最後に取得したデータを親画面に送る事を考えていますが、現段階ではグリッドの値を取得する事が先決なので、後回し・・

    どんな方法で値を取得出来るのか、何かアドバイスをよろしくお願いします。


    03188
    2011年1月14日 8:18

回答

  • 仮にe.Resultの型をList<DBType>であるとします。

    このとき、MyDgのSelectedItemには、nullかDBTypeのインスタンスが設定せれているはずです。よって、選択されている行のデータを取得したい場合のコードはこんな感じになります。

    var selectedItem = this.DataGrid.SelectedItem as DBType;
    if (selectedItem != null)
    {
       // 表示データ1の列のデータを取得
       var kozKnRCode = selectedItem.KOZ_KNR_CODE;
    }
    

    • 回答としてマーク 03188 2011年1月21日 2:57
    2011年1月17日 4:36

すべての返信

  • MyData selectedItem = this.DataGrid.SelectedItem as MyData;
    
    で要件を満たせますでしょうか。
    2011年1月14日 15:52
  • 返信ありがとうございます。

    >MyData selectedItem = this.DataGrid.SelectedItem as MyData;

    これは、MyDataというエンティティクラスを作成して、表示させたデータグリッドにバインディングするというイメージであってますでしょうか?

    上記のイメージ通りに行う際に一点問題が発生します。

    そもそも、このデータグリッドにはデータベースのソースを表示する為にバインディングをすでに行っているのです。

    <sdk:DataGrid x:Name="MyDg" VerticalAlignment="Top" Loaded="DataGrid_Loaded" AutoGenerateColumns="False" SelectionChanged="ReferenceGd_SelectionChanged">
     		<sdk:DataGrid.Columns>
     			<sdk:DataGridTextColumn x:Name="Display1" Binding="{Binding フィールド名}" DisplayIndex="-1" Header="表示データ1" IsReadOnly="True" />
     			<sdk:DataGridTextColumn x:Name="Display2" Binding="{Binding フィールド名}" DisplayIndex="-1" Header="表示データ2" IsReadOnly="True" />
     		</sdk:DataGrid.Columns>
     	</sdk:DataGrid>

    という理由で、教えて頂いたコードを使えません。もしくは、使い方が分からない状態です。

    申し訳ありませんが、私のイメージは合っているいるのかどうか。間違っているなら、恐縮ですがもう少し説明を頂けないでしょうか。

    以上、よろしくお願いします。


    03188
    • 編集済み 03188 2011年3月1日 1:23
    2011年1月15日 8:31
  • 仮にe.Resultの型をList<DBType>であるとします。

    このとき、MyDgのSelectedItemには、nullかDBTypeのインスタンスが設定せれているはずです。よって、選択されている行のデータを取得したい場合のコードはこんな感じになります。

    var selectedItem = this.DataGrid.SelectedItem as DBType;
    if (selectedItem != null)
    {
       // 表示データ1の列のデータを取得
       var kozKnRCode = selectedItem.KOZ_KNR_CODE;
    }
    

    • 回答としてマーク 03188 2011年1月21日 2:57
    2011年1月17日 4:36
  • 回答ありがとうございます。 なかなか、理解するのに時間がかかってしまい返信が遅くなってしまいました。

     すみません。。。

    結局、リストに入れた値を(List<DBType> test = e.Result.ToList();

    下のコードで取り出しました。

    x = test[ReferenceGd.SelectedIndex].フィールド名;

    その後、親画面の方でデータを引き取りました。

    TextBox.text = ChildWindow.SBC

    ちなみに、x は子画面でpublic string宣言をしました。

     

    無事解決しました! ありがとうございました。


    03188
    2011年1月21日 2:53