質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

解決済

WPF:DataGrid上で手入力した値をエクスポート時に反映させたい

syah
syah

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1回答

1評価

1クリップ

267閲覧

投稿2022/04/25 05:47

編集2022/05/31 10:14

前提

C#のWPFで、テキストファイルを読み込んで特定の文字列を検索し、CSVで表にするプログラムを作っています。
文字列を検索してCSVに出力するプログラムはできましたが、DataGrid上で手入力したキーワードを参照するところが上手くいきません。

実現したいこと

  • DataGrid上で手入力したデータをFileIO.csに値を渡したい。

発生している問題・エラーメッセージ

dataGrid1のItemSourceを参照し、DataGridで手入力で変更された内容を反映したいのですが、FileIO.csでnewしてWordListを参照してしまうと、新しくインスタンスを生成して参照してしまうので、初期値のデータを参照してしまいます。

該当のソースコード

MainWindow.xaml.cs

// private void Button_Click_3(object sender, RoutedEventArgs e) { WordList wl = new WordList(); wl.Show(); } private void Button_Click_4(object sender, RoutedEventArgs e) // エクスポート { // ボタン2のクリック・イベント FileIO fileIo = new FileIO(); fileIo.Export(tb.Text); }

WordList.xaml

<Grid> <Label Content="カラム名:" FontSize="12" Margin="10,29,0,192" Width="72" HorizontalAlignment="Left"/> <TextBox Name="tb" Margin="67,29,115,0" Cursor="Arrow" VerticalAlignment="Top" /> <DataGrid x:Name="dataGrid1" ItemsSource="{Binding DataTableView}" SelectedItem="{Binding SelectedRow}" Margin="3,68,0,116" Width ="300" Height ="200" >

WordList.xaml.cs

using System; using System.Collections.ObjectModel; using System.Windows; using Microsoft.Win32; using System.IO; namespace LogCSVConverter { public partial class WordList : Window { public WordList() { InitializeComponent(); var dataList = new ObservableCollection<Product>(); for (int i = 0; i < 5; ++i) { var prefix = i + 1; var data = CreateData(prefix); dataList.Add(data); } dataGrid1.ItemsSource = dataList; } private void add_button_Click(object sender, RoutedEventArgs e) { var dataList = dataGrid1.ItemsSource as ObservableCollection<Product>; var prefix = dataList.Count + 1; var data = CreateData(prefix); dataList.Add(data); } } }

Product.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LogCSVConverter { public class Product { public string Keyword { get; set; } public int Margin { get; set; } public string Clip_char { get; set; } public Product(string key, int margin, string clip_char) { Keyword = key; Margin = margin; Clip_char = clip_char; } } }

FileIO.cs

using System; using System.IO; using System.Collections.ObjectModel; using System.Windows; using Microsoft.Win32; namespace LogCSVConverter { class FileIO { public void Export(string Path) { if (Path != string.Empty) { string FileContents = String.Join("\r\n", File.ReadAllLines(Path)); // ダイアログのインスタンスを生成 var dialog = new SaveFileDialog(); // ファイルの種類を設定 dialog.Filter = "CSVファイル (*.csv)|*.csv|全てのファイル (*.*)|*.*"; // ダイアログを表示する dialog.ShowDialog(); if (dialog.FileName != string.Empty) //保存パスを選択してないときは通さない { using (StreamWriter writer = new StreamWriter(dialog.FileName)) { // ファイルに書き込む writer.WriteLine(Search(FileContents)); } } } else { // 選択されたファイル名 (ファイルパス) をメッセージボックスに表示 MessageBox.Show("ファイルパスを指定してください"); } } public string Search(string str)//検索対象のファイルの中身、検索キーワード、 抽出文字列 { var dataList = new ObservableCollection<Product>(); WordList wl = new WordList();// newしたら参照できなくなる dataList = wl.ReadData();//アイテムソースのデータを読み込む int primary_num = 0;//主キーの番号 MessageBox.Show("検索キーワード:" + dataList[primary_num] + "\n文字列の長さ:"+str.Length); string result = ""; Console.WriteLine(); for (int j=0;j< 98; j++) { int[] pos = new int[dataList.Count]; //検索キーワードの位置([]はデータテーブルの行の数で決める) string p_key = dataList[primary_num].Keyword; pos[primary_num] = str.IndexOf(p_key, pos[primary_num] + 1); //主キー位置を先に検索 if (pos[primary_num] == -1) { MessageBox.Show("全ての検索処理が終了しました"); break; } for(int i = 0; i < dataList.Count; i++) { if (i != primary_num) //主キー以外は主キー位置を基準に検索 { pos[i] = str.IndexOf(dataList[i].Keyword, pos[primary_num] + 1); //現在の位置から次のキーの位置を検索 } int key_length = dataList[i].Keyword.Length; int clp_length = dataList[i].Clip_char.Length; int margin = dataList[i].Margin; result += string.Concat(str.AsSpan(pos[i] + key_length + margin, clp_length), "\t"); // 抽出したい文字列を出力する } result += "\n"; } return result; } } }

試したこと

ItemControll.ItemSourceをWordListをnewで無理やり参照したり、Staticにして参照を試みましたが、どれも上手くいきませんでした。
Staticを使わずに参照できる方法があれば、何卒ご教授お願い致します。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです