2016-12-21 17 views
0

私は電話帳をコーディングしています。それは完全にコード化されており、私は結果に本当に満足しています(最初に完成したアプリケーション!)。 WPFでコード化された電話帳です。DataGridを使用して、単に追加された人の値を格納しています。ことは私が人々を追加することができ、私はそれをシャットダウンし、すべての格納されたデータが失われるまで、それはすべて滑らかです。これは、私がやったすべての小規模なプロジェクトで常に起こりますが、それらの多くは方程式を通していくつかの数値を実行し、私に答えを与えることができ、私が得たデータは必要ありませんでした。しかし、私の電話帳では、私は自分のユーザーがそれを開いて何度も何度も繰り返し使いたいと思っています。 D終了時にアプリケーションデータを保存する

EDIT:私のDataGridはSQLデータベースにバインドされていないので、閉じるの後に開くと更新できません。

+2

初めて完成したアプリを完成させていただきありがとうございます。残念ながら、あなたの質問は答えが簡単ではありません。なぜなら、それはどんな詳細も提供しないからです。 [尋ねる]。あなたは、あなたのデータ構造を記述する少なくともいくつかのコードを投稿する必要があります。 [ツアー] – dasblinkenlight

+0

そして、どこにデータを保存したいですか?データベース?ディスク?どの形式ですか? –

+0

errr、それは数百行でかなり大きいですが、基本的にユーザーからの入力を受け取り、それをDataGridに入れます。また、Nawed Nabi Zada(クールな名前btw:o)は、保存ファイルとしてディスクに保存してからアプリケーションをロードするのが最も簡単だと思います。 –

答えて

0

Windowには、それぞれClosingClosedというイベントがあります。

0

コメントで述べたように、あなたの質問は少しあいまいですが、ここであなたが分離ストレージ内のデータを含むファイルを作成するために、バイナリシリアル化を使用してのために働いた例です(MSDN Isolated Storageを参照)

私はあなたには、いくつかを持っていると仮定あなたのDataGridのバッキングクラスの一種です。この場合、Contactというクラスを作成しました。 [Serializable]属性に注意してください。

[Serializable] 
public class Contact { 
    public String Name { get; set; } 
    public String Number { get; set; } 

    public Contact(String name, String number) { 
     Name = name; 
     Number = number; 
    } 
} 

私は、これらのリストを持っている:

private List<Contact> contacts; 

あなたのWindowOnClosingメソッドをオーバーライドして、ファイルまでデータを保存することができます

protected override void OnClosing(CancelEventArgs e) { 
    base.OnClosing(e); 
    using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, null, null)) { 
     if (isoStore.FileExists("contacts.dat")) { 
      // We already have an old one, delete it 
      isoStore.DeleteFile("contacts.dat"); 
     } 
     using (IsolatedStorageFileStream fs = isoStore.CreateFile("contacts.dat")) { 
      BinaryFormatter bf = new BinaryFormatter(); 
      bf.Serialize(fs, contacts); 
     } 
    } 
} 

最後に、必要な初期化を行った後で、このファイルを探して連絡先を復元することができますw。

using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, null, null)) { 
    if (isoStore.FileExists("contacts.dat")) { 
     IsolatedStorageFileStream fs = isoStore.OpenFile("contacts.dat", System.IO.FileMode.Open); 
     BinaryFormatter bf = new BinaryFormatter(); 
     contacts = (List<Contact>) bf.Deserialize(fs); 
    }else { 
     // We don't have a backup file, create some dummy entries 
     contacts = new List<Contact>(); 
     contacts.Add(new Contact("John Smith", "1234567")); 
     contacts.Add(new Contact("Emma Brown", "7654321")); 
    } 
} 
MyDataGrid.ItemsSource = contacts; 
0

あなたのDataGridののItemsSourceは、IEnumerableを<T>に設定するか、またはバインドする必要があります。バックアップがない場合、私はいくつかのダミーのエントリを追加している注意してください。ディスク上のファイルにデータを保存するには、IEnumerable <T>のすべての項目をファイルにシリアライズします。その後、アプリケーションの起動時に再度デシリアライズします。次のサンプルコードはあなたにその考えを与えるはずです。

MainWindow.xaml:

<DataGrid x:Name="dataGrid" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Name}" /> 
     <DataGridTextColumn Binding="{Binding Number}" /> 
    </DataGrid.Columns> 
</DataGrid> 

MainWindow.xaml.cs:

public partial class MainWindow : Window 
{ 
    private const string _fileName = "phonebook.txt"; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.Loaded += (s, e) => 
     { 
      //create a List<Item> that contains the data from the file on a background thread 
      Task.Run(() => LoadData()).ContinueWith(task => 
      { 
       //...and set the ItemsSource property of the DataGrid to the returned List<Item> 
       dataGrid.ItemsSource = task.Result; 
      }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); 
     }; 

     this.Closing += (s, e) => SaveData(); 
    } 

    public List<Item> LoadData() 
    { 
     List<Item> items = new List<Item>(); 
     if (System.IO.File.Exists(_fileName)) 
     { 
      string[] lines = System.IO.File.ReadAllLines(_fileName); 
      foreach (string line in lines) 
      { 
       string[] columns = line.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); 
       if (columns.Length == 2) 
       { 
        items.Add(new Item() 
        { 
         Name = columns[0], 
         Number = columns[1] 
        }); 
       } 
      } 
     } 
     else 
     { 
      //populate the DataGrid with some default data... 
      items.Add(new Item { Name = "Name1", Number = "000-111" }); 
      items.Add(new Item { Name = "Name2", Number = "111-222" }); 
     } 

     return items; 
    } 

    private void SaveData() 
    { 
     IEnumerable<Item> items = dataGrid.ItemsSource as IEnumerable<Item>; 
     if (items != null) 
     { 
      using (System.IO.StreamWriter sw = new System.IO.StreamWriter(_fileName)) 
       foreach (Item item in items) 
        sw.WriteLine($"{item.Name};{item.Number}"); 
     } 
    } 
} 

Item.cs:

public class Item 
{ 
    public string Name { get; set; } 
    public string Number { get; set; } 
} 

「のpH _fileNameの値を変更しない限り、実行可能ファイル(.exe)のVisual Studioからアプリケーションを実行しているときに出力ディレクトリ(通常はc:¥YourProjectFolder¥bin¥Debugまたは¥bin¥Release)に保存されます。フィールド。

関連する問題