2017-09-05 56 views
0

現在、私はWPF C#でアプリケーションを作成しています。これは、Javaで書かれた他のプロセスのヘルパーです。これらの他のプロセスには、 "SKIP"と呼ばれる列に異なる "名前"がリストされているconfiguration.csvが必要です。スキップ時に列がXの場合、Javaプログラムはそれらの名前をスキップし、従属プロセスをスキップします。C#WPF読み込み/編集CSV

ExcelでCSVを開いて行を編集すると、すべて正常に動作します。それは問題ではありません。私が達成したいのは、WPFアプリケーション(最初と最後の行を除く)のDataGridに行をリストすることです。ユーザーは、その特定の名前をスキップするかどうかを決めるチェックボックスにチェックを入れることができます。 Saveを押すと、.CSVが更新されます。

私はすでに、このトピックをよく知っている友人といくつかのコードを書いています。 WinFormsでは正常に動作しましたが、WPFでは動作しません。チェックボックスの値は取得できず、CSVに保存することもできません。

CODE:

private void OBJ_SaveButton_Click(object sender, RoutedEventArgs e) 
    { 
     if (OBJ_DataGrid.Items.Count == 0) 
     { 
      MessageBox.Show("Kein Datensatz in der View."); 
      return; 
     } 
     /*if (Directory.Exists(path)) 
     { 
      if (File.Exists(filepath)) 
      { 
       string tmp = null; 
       try 
       { 
        FileStream fileStr = new FileStream(filepath, FileMode.Create); 
        StreamWriter strWriter = new StreamWriter(fileStr); 
        strWriter.WriteLine("SFObject;Skip"); 
        for(int i=0;i< itmGrd.Count;i++) 
        { 
         switch (itmGrd[i].ItemValue) 
         { 
          case true: 
           tmp = itmGrd[i].ItemName + ";X"; 
           break; 
          case false: 
           tmp = itmGrd[i].ItemName + ";"; 
           break; 
         } 
         strWriter.WriteLine(tmp); 
        } 
        strWriter.WriteLine("SuccessMSG;"); 
        strWriter.Close(); 
        fileStr.Close(); 
        LoadConf(); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 
      } 
      else 
       MessageBox.Show("ERR_F0: Pfad nicht gefunden."); 
     } 
     else 
      MessageBox.Show("ERR_D0: Pfad nicht gefunden.");*/ 
    } 

    private void OBJ_ReloadButton_Click(object sender, RoutedEventArgs e) 
    { 

    } 

    private void OBJ_DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 

    } 

    private void OBJ_DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
    { 
     MessageBox.Show(e.Row.ToString()); 
    } 

    void OnChecked(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show(e.Source.ToString()); 
    } 


} 

public class ItemGrid 
{ 
    public ItemGrid(string name, bool rval) 
    { 
     ItemName = name; 
     ItemValue = rval; 
    } 

    public string ItemName { set; get; } 
    public bool ItemValue { set; get; } 
} 

public class ItemsGrid : List<ItemGrid> 
{ 
    public string path = null; 
    public string filepath = null; 
    public ItemsGrid() 
    { 
     path = String.Format(@"{0}\build\", Environment.CurrentDirectory); 
     filepath = Path.Combine(path + "configuration.csv"); 
     if (Directory.Exists(path)) 
     { 
      if (File.Exists(filepath)) 
      { 
       string line = null; 
       StreamReader file = new StreamReader(filepath); 
       while ((line = file.ReadLine()) != null) 
       { 
        if (!line.Equals("SFObject;Skip") && !line.Equals("SuccessMSG;")) 
        { 
         string input = (line.IndexOf(";X") != -1 ? (line.Replace(";X", "")) : (line.Replace(";", ""))); 
         Add(new ItemGrid(input, (line.IndexOf(";X") != -1 ? (true) : (false)))); 
        } 
       } 
       file.Close(); 
      } 
      else 
       MessageBox.Show("ERR_F0: Pfad nicht gefunden."); 
     } 
     else 
      MessageBox.Show("ERR_D0: Pfad nicht gefunden."); 


     //Add(new ItemGrid("Tom", false)); 
     // Add(new ItemGrid("Jen", false)); 

    } 

} 

これは、見た目(とようになっているはずです)方法です。 Image1

CSV:

Image2

私はあなたたちが私を助けることができ、それは働いていない理由は、私は本当に理解していないことを願っています。私はC#に熟達しているのではないことを認めなければならない。

答えて

0

貼り付けたCSVが適切にフォーマットされているとみなしています。

// HelperClass.cs 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace WpfCsvSkipTicker 
{ 
    public static class HelperClass 
    { 
     public static List<ItemGrid> ReadCsv(string filepath) 
     { 
      if (!File.Exists(filepath)) return null; 
      var allLines = File.ReadAllLines(filepath); 
      var result = 
       from line in allLines.Skip(1).Take(allLines.Length -2) 
       let temparry = line.Split(';') 
       let isSkip = 
        temparry.Length > 1 
        && temparry[1] != null 
        && temparry[1] == "X" 
       select new ItemGrid { ItemName = temparry[0], ItemValue = !isSkip }; 
      return result.ToList(); 
     } 

     public static void WriteCsv(IEnumerable<ItemGrid> items, string filepath) 
     { 
      var temparray = items.Select(item => item.ItemName + ";" + (item.ItemValue ? "" : "X")).ToArray(); 
      var contents = new string[temparray.Length + 2]; 
      Array.Copy(temparray, 0, contents, 1, temparray.Length); 
      contents[0] = "SFOBject;Skip"; 
      contents[contents.Length - 1] = "SuccessMSG;"; 
      File.WriteAllLines(filepath, contents); 
     } 
    } 

    public class ItemGrid 
    { 
     public string ItemName { set; get; } 
     public bool ItemValue { set; get; } 
    } 
} 

そして...

// MainWindow.xaml.cs 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.dataGridView.ItemsSource = HelperClass.ReadCsv(@"PathToRead\configuration.csv"); 
    } 

    private void btnSave_Click(object sender, RoutedEventArgs e) 
    { 
     var temp = new List<ItemGrid>(); 
     for (int i = 0; i < this.dataGridView.Items.Count; i++) 
     { 
      if (this.dataGridView.Items[i] is ItemGrid) // DataGrid pads it's item collection with elements we didn't add. 
       temp.Add((ItemGrid)this.dataGridView.Items[i]); 
     } 
     HelperClass.WriteCsv(temp, @"PathToSave\new_configuration.csv"); 
    } 
} 
+1

こんにちは@WithMetta、このためにそんなにありがとう!すべて今は完璧に機能します。 2時間で最初のデモを手に入れました。今すぐアプリケーションが完了しました!ありがとう、ありがとう! – Pierre

+0

最高の運勢! – WithMetta

関連する問題