Невозможно назначить данные массиву объектов в WPF с C # - PullRequest
0 голосов
/ 27 июня 2010
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;
        }
    }
}

Здесь проблема в том, что я раньше запускал эту часть программного обеспечения, но без массива items [300]. В то время был только один экземпляр элемента, но теперь мне также нужно хранить их в массиве. Кажется, есть ошибка с первым оператором if, который пытается присвоить имя İsim значению первого элемента (item [0]).

спасибо за любую помощь

Ответы [ 2 ]

4 голосов
/ 27 июня 2010

Вы не присваиваете значение самому элементу - где-то вам нужно:

items[j] = new item();

В настоящее время вы просто пытаетесь установить свойства для несуществующего объекта - то есть через нулевую ссылку.

(Кстати, я согласен с идеей использования List<item>. Я бы также переименовал item в Item, чтобы соответствовать соглашениям об именах .NET).

Учитывая ваш текущий код, простейшее решение, вероятно, таково:

if (i == 0)
{
    items[j] = new item();
    items[j].İsim = line;
}
0 голосов
/ 27 июня 2010
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>();
...