2010-06-27 63 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 
using System.IO; 
namespace shop_management 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public class user 
     { 
      public string İsim { set; get; } 
      public string Borç { set; get; } 

     } 
     public class item 
     { 
      public string Tehlike { set; get; } 
      public string İsim { set; get; } 
      public decimal Birim { set; get; } 
      public decimal Miktar { set; get; } 

     } 
     public MainWindow() 
     { 
      this.InitializeComponent(); 
      if (!(File.Exists("C:\\data\\users"))) //here the software checks if the files exist or not 
      { 
       MessageBox.Show("Error!!!"); 
       this.Hide(); 
      } 
      if (!(File.Exists("C:\\data\\items"))) 
      { 
       MessageBox.Show("Error!!!"); 
       this.Hide(); 
      } 
      string dan_in=""; 
      StreamReader sr_main; 
      int i = 0,j=0; 
      List<item> list_items = new List<item>(); 
      string first_read; 
      sr_main = File.OpenText("C:\\data\\items"); //this is the file that we take our items data 
      first_read = sr_main.ReadToEnd(); 
      string[] manip_read = first_read.Split('\t'); //in the file, there is only "/t"s between datas. for example "name1/tprice1/tcount1/tdanger1t/name2/tprice2/tcount2/tdanger2" etc. 
      item[] items = new item[300]; //here i declared a 300 items long array, which means the software will crash if there is 301, solve this! 
      foreach (string line in manip_read) 
      { 


       if (i == 0) items[j].İsim = line; //this line keeps record of the items name 
       if (i == 1) items[j].Birim = Convert.ToDecimal(line); // this line keeps the price 
       if (i == 2) items[j].Miktar = Convert.ToDecimal(line); // this line keeps how many left 
       if (i == 3) items[j].Tehlike = line; //and this line keeps the danger level 
       i++; 
       if (i == 4) //here the loop adds the data to list 
       { 
        if (items[j].Miktar < Convert.ToDecimal(items[j].Tehlike) || items[j].Miktar == Convert.ToDecimal(items[j].Tehlike)) dan_in = "!!!"; 
        list_items.Add(new item() { İsim = items[j].İsim, Miktar =items[j].Miktar , Birim=items[j].Birim, Tehlike=dan_in }); 
        dan_in = ""; 
        i = 0; 
        j++; 
       } 

      } 
      grid_items.ItemsSource = list_items; 
     } 
    } 
} 

這裏的問題是,我運行這部分軟件之前,但沒有項目[300]數組。那時,只有一個項目的實例,但現在我還需要將它們保存在一個數組中。似乎嘗試分配第一個項目(項目[0])的名稱İsim值的第一個if語句存在錯誤。不能分配數據到WPF中的對象數組與C#

感謝您的幫助

回答

4

你不是元素本身分配的值 - 你需要地方

items[j] = new item(); 

目前你只是想設置適當的綁定一個不存在的對象 - 即通過空引用。

(我會用List<item>還有,順便的想法一致。我還重新命名itemItem以配合.NET命名約定。)

鑑於當前的代碼中,最簡單的辦法大概是這樣的:

if (i == 0) 
{ 
    items[j] = new item(); 
    items[j].İsim = line; 
} 
+0

+1對於'鑑於您當前的代碼':-) – 2010-06-27 07:02:10

+0

好吧,我相信我的代碼不是「可調試」類型:D 無論如何感謝:D – gkaykck 2010-06-27 07:05:03

+0

@gkaykck:是的,我會認真考慮試圖重構你的代碼,使其更具可讀性。比如只需要在需要時聲明變量 - 並將方法分解爲更小的變量。 – 2010-06-27 07:06:45

0
item[] items = new item[300]; //here i declared a 300 items long array, which means the software will crash if there is 301, solve this! 

使用動態列表,而不是一個固定長度的數組:

List<item> items = new List<item>(); 
+0

感謝,但它不是一個問題:d – gkaykck 2010-06-27 06:58:22

+1

正確的,但它確實很難讀懂你的代碼。 – 2010-06-27 06:59:57

+0

但我想我只能使用list_items來操作物品數量。我會嘗試,然後再次感謝 – gkaykck 2010-06-27 07:00:42