ObservableCollection无缘无故地在foreach循环中为空

时间:2018-09-15 11:43:03

标签: c#

正如标题所述,我在代码中间为空。

我不做任何后台工作/线程工作,因此它无法在执行代码的中间清空自身。每次都会在某个特定点将其清空。

ObservableCollection在我的情况下是proizvod.GrupeIPodgrupe

这是发生的地方:

private void NamestiGrupeIPodgrupe()
{
    foreach (TreeNode n in treeView1.Nodes)
    {
        if (proizvod.GrupeIPodGrupe.Grupe.Any(g => g.Id == (int)n.Tag))
        {
            n.Checked = true;

            foreach (TreeNode n1 in n.Nodes) //Here it empty
            {
                if (proizvod.GrupeIPodGrupe.Podgrupe.Any(pg => pg.PodGrupaId == (int)n1.Tag))
                {
                    n1.Checked = true;
                }
            }
        }
        else
            n.Checked = false;
    }
}

下面是我逐步调试时的图像:

这里是发生此问题的Form类的完整代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Magacin.Sajt;

namespace Magacin
{
    public partial class Sajt_Proizvod : Form
    {
        private Proizvod proizvod;
        private Komercijalno.Roba roba;

        public Sajt_Proizvod(int proizvodID)
        {
            InitializeComponent();
            UcitajGrupeIPodgrupe();
            this.roba = new Komercijalno.Roba(proizvodID);

            UcitajProizvod(proizvodID);

            k_jm_txt.Text = roba.Jm;
            k_katBr_txt.Text = roba.KatBr;
            k_naziv_txt.Text = roba.Naziv;
            k_pdv_txt.Text = String.Format("{0:#.00}%", roba.Pdv);
            k_robaid_txt.Text = roba.RobaId.ToString();

            NamestiGrupeIPodgrupe();
        }

        private void PodesiPremaPravima()
        {
            if (!Korisnik.ImaPravo(200103))
            {
                w_naziv_txt.Enabled = false;
                w_naziv_txt.BackColor = SystemColors.Info;

                slika_txt.Enabled = false;
                slika_txt.BackColor = SystemColors.Info;

                w_opis_rtxt.Enabled = false;
                w_opis_rtxt.BackColor = SystemColors.Info;

                akcijskiArtikal_cb.Enabled = false;
                akcijskiArtikal_cb.BackColor = SystemColors.Info;

                aktivan_cb.Enabled = false;
                aktivan_cb.BackColor = SystemColors.Info;

                button2.BackColor = SystemColors.Info;
            }
            else
            {
                w_naziv_txt.Enabled = true;
                w_naziv_txt.BackColor = SystemColors.Window;

                slika_txt.Enabled = true;
                slika_txt.BackColor = SystemColors.Window;

                w_opis_rtxt.Enabled = true;
                w_opis_rtxt.BackColor = SystemColors.Window;

                akcijskiArtikal_cb.Enabled = true;
                akcijskiArtikal_cb.BackColor = SystemColors.Window;

                aktivan_cb.Enabled = true;
                aktivan_cb.BackColor = SystemColors.Window;
            }
        }

        private void NamestiGrupeIPodgrupe()
        {
            foreach (TreeNode n in treeView1.Nodes)
            {
                if (proizvod.GrupeIPodGrupe.Grupe.Any(g => g.Id == (int)n.Tag))
                {
                    n.Checked = true;

                    foreach (TreeNode n1 in n.Nodes)
                    {
                        if (proizvod.GrupeIPodGrupe.Podgrupe.Any(pg => pg.PodGrupaId == (int)n1.Tag))
                        {
                            n1.Checked = true;
                        }
                    }
                }
                else
                    n.Checked = false;
            }
        }

        private void UcitajProizvod()
        {
            proizvod = new Proizvod(proizvod.PROIZVODID);

            w_proizvodId_txt.Text = proizvod.PROIZVODID.ToString();
            w_naziv_txt.Text = proizvod.NAZIV.ToString();
            w_katBr_txt.Text = proizvod.KATBR.ToString();
            w_pdv_txt.Text = String.Format("{0}%", proizvod.PDV);
            w_jm_txt.Text = proizvod.JM.ToString();
            slika_txt.Text = proizvod.SLIKA.ToString();
            kratakOpis_txt.Text = proizvod.KratakOpis;
            w_opis_rtxt.Text = proizvod.OPIS;

            akcijskiArtikal_cb.Checked = (proizvod.AKCIJSKI_ARTIKAL == 1) ? true : false;
            aktivan_cb.Checked = (proizvod.AKTIVAN == 1) ? true : false;
        }

        private void UcitajProizvod(int poizvodId)
        {
            proizvod = new Proizvod(poizvodId);

            w_proizvodId_txt.Text = proizvod.PROIZVODID.ToString();
            w_naziv_txt.Text = proizvod.NAZIV.ToString();
            w_katBr_txt.Text = proizvod.KATBR.ToString();
            w_pdv_txt.Text = String.Format("{0}%", proizvod.PDV);
            w_jm_txt.Text = proizvod.JM.ToString();
            slika_txt.Text = proizvod.SLIKA.ToString();
            kratakOpis_txt.Text = proizvod.KratakOpis;
            w_opis_rtxt.Text = proizvod.OPIS;

            akcijskiArtikal_cb.Checked = (proizvod.AKCIJSKI_ARTIKAL == 1) ? true : false;
            aktivan_cb.Checked = (proizvod.AKTIVAN == 1) ? true : false;
        }

        private void UcitajGrupeIPodgrupe()
        {
            List<Grupa> grupe = Grupa.ListaSvihGrupa();

            foreach(Grupa gp in grupe)
            {
                TreeNode tn = new TreeNode(gp.Naziv);

                List<PodGrupa> pg = PodGrupa.ListaSvihPodgrupa(gp.Id);

                if(pg != null && pg.Count > 0)
                {
                    foreach(PodGrupa pgp in pg)
                    {
                        TreeNode tn1 = new TreeNode(pgp.Naziv);
                        tn1.Tag = pgp.PodGrupaId;
                        tn1.ToolTipText = "PodGrupa";
                        tn.Nodes.Add(tn1);
                    }
                }

                tn.Tag = gp.Id;
                tn.ToolTipText = "Grupa";
                treeView1.Nodes.Add(tn);
            }
        }

        private void sacuvaj_btn_Click(object sender, EventArgs e)
        {
            if (Korisnik.ImaPravo(200103))
            {
                proizvod.Update();
                MessageBox.Show(proizvod.errorMessage);
            }
            else
            {
                MessageBox.Show("Nemate pravo pristupa modulu [ 200103 ] ");
            }
        }

        private void odbaci_btn_Click(object sender, EventArgs e)
        {
            UcitajProizvod();
        }

        private void novi_btn_Click(object sender, EventArgs e)
        {
            using (Sajt_NoviProizvod np = new Sajt_NoviProizvod())
            {
                np.ShowDialog();
            }
        }

        private void w_naziv_txt_TextChanged(object sender, EventArgs e)
        {
            proizvod.NAZIV = w_naziv_txt.Text;
            sacuvaj_btn.Enabled = true;
            odbaci_btn.Enabled = true;
        }

        private void w_jm_txt_TextChanged(object sender, EventArgs e)
        {
            proizvod.JM = w_jm_txt.Text;
        }

        private void w_opis_rtxt_TextChanged(object sender, EventArgs e)
        {
            proizvod.OPIS = w_opis_rtxt.Text;
            sacuvaj_btn.Enabled = true;
            odbaci_btn.Enabled = true;
        }

        private void akcijskiArtikal_cb_CheckedChanged(object sender, EventArgs e)
        {
            proizvod.AKCIJSKI_ARTIKAL = Convert.ToInt32(akcijskiArtikal_cb.Checked);
            sacuvaj_btn.Enabled = true;
            odbaci_btn.Enabled = true;
        }

        private void aktivan_cb_CheckedChanged(object sender, EventArgs e)
        {
            proizvod.AKTIVAN = Convert.ToInt32(aktivan_cb.Checked);
            sacuvaj_btn.Enabled = true;
            odbaci_btn.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            using (Sajt_Paketi sp = new Sajt_Paketi(proizvod.PROIZVODID))
            {
                sp.ShowDialog();
            }
        }

        private void slika_txt_TextChanged(object sender, EventArgs e)
        {
            proizvod.SLIKA = slika_txt.Text;
            sacuvaj_btn.Enabled = true;
            odbaci_btn.Enabled = true;
        }

        private void kratakOpis_txt_TextChanged(object sender, EventArgs e)
        {
            proizvod.KratakOpis = kratakOpis_txt.Text;
            sacuvaj_btn.Enabled = true;
            odbaci_btn.Enabled = true;
        }

        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Parent != null)
            {
                if (e.Node.Parent.Parent != null)
                {
                    e.Node.Parent.Parent.Checked = true;
                }
                e.Node.Parent.Checked = true;
            }

            if (e.Node.Tag.ToString() == "Grupa")
            {
                foreach (TreeNode tn in e.Node.Nodes)
                {
                    tn.Checked = false;
                }
            }

            ProveriGrupeIPodgrupe();

            sacuvaj_btn.Enabled = true;
            odbaci_btn.Enabled = true;
        }

        private void ProveriGrupeIPodgrupe()
        {
            proizvod.GrupeIPodGrupe.Reset();

            foreach (TreeNode tn in treeView1.Nodes)
            {
                if (tn.Checked)
                {
                    foreach (TreeNode tn1 in tn.Nodes)
                    {
                        if (tn1.Checked)
                        {
                            proizvod.GrupeIPodGrupe.Podgrupe.Add(new PodGrupa { PodGrupaId = Convert.ToInt32(tn1.Tag), GrupaId = Convert.ToInt32(tn.Tag) });
                        }
                    }
                }
            }
        }

        private void odbaci_btn_EnabledChanged(object sender, EventArgs e)
        {
            if (odbaci_btn.Enabled)
                odbaci_btn.BackColor = Color.White;
            else
                odbaci_btn.BackColor = Color.DimGray;
        }

        private void sacuvaj_btn_EnabledChanged(object sender, EventArgs e)
        {
            if (sacuvaj_btn.Enabled)
                sacuvaj_btn.BackColor = Color.White;
            else
                sacuvaj_btn.BackColor = Color.DimGray;
        }
    }
}

这是我的Proizvod

public class Proizvod
{
    #region Variables
    public int PROIZVODID { get { return _PROIZVODID; } set { _PROIZVODID = value; } }
    public string NAZIV { get { return _NAZIV; } set { _NAZIV = value; } }
    public string OPIS { get { return _OPIS; } set { _OPIS = value; } }
    public string JM { get { return _JM; } set { _JM = value; } }
    public int AKCIJSKI_ARTIKAL { get { return _AKCIJSKI_ARTIKAL; } set { _AKCIJSKI_ARTIKAL = value; } }
    public int AKTIVAN { get { return _AKTIVAN; } set { _AKTIVAN = value; } }
    public string KATBR { get { return _KATBR; } set { _KATBR = value; } }
    public double PDV { get { return _PDV; } set { _PDV = value; } }
    public string SLIKA { get { return _SLIKA; } set { _SLIKA = value; } }
    public string KratakOpis { get { return _KratakOpis; } set { _KratakOpis = value; } }
    public GrupeIPodgrupe GrupeIPodGrupe { get { return _GrupeIPodGrupe; } }
    public List<Paket> Paketi { get { return _Paketi; } }

    public string errorMessage { get { return _errorMessage; } }

    private int _PROIZVODID;
    private string _NAZIV;
    private string _OPIS;
    private string _JM;
    private int _AKCIJSKI_ARTIKAL;
    private int _AKTIVAN;
    private string _KATBR;
    private double _PDV;
    private string _SLIKA;
    private string _KratakOpis;
    private GrupeIPodgrupe _GrupeIPodGrupe;
    private List<Paket> _Paketi;

    private string fileNameSlika;
    private string pathSlika;

    string _errorMessage = "Sve je ok!";
    #endregion

    #region classes
    public class GrupeIPodgrupe
    {
        public ReadOnlyCollection<Grupa> Grupe
        {   
            get
            {
                return _Grupe.AsReadOnly();
            }
        }

        public ObservableCollection<PodGrupa> Podgrupe
        {
            get
            {
                return _PodGrupe;
            }
            set
            {
                _PodGrupe = value;
            }
        }

        private List<Grupa> _Grupe;
        private ObservableCollection<PodGrupa> _PodGrupe;

        private void HandleChange(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                foreach (PodGrupa pg in e.NewItems)
                {
                    if (_Grupe.Count < 1 || !_Grupe.Any(g => g.Id == pg.GrupaId))
                    {
                        _Grupe.Add(new Grupa { Id = pg.GrupaId });
                    }
                }
            }
        }

        public GrupeIPodgrupe()
        {
            _PodGrupe = new ObservableCollection<PodGrupa>();
            _PodGrupe.CollectionChanged += HandleChange;
        }

        public GrupeIPodgrupe(int proizvodId)
        {
            this._Grupe = Grupa.ListaGrupaProizvoda(proizvodId);

            if(this.Grupe.Count > 0)
            {
                this.Podgrupe = PodGrupa.ListaPodgrupaProizvoda(Grupe[0].Id, proizvodId);
            }
        }

        public GrupeIPodgrupe(TreeView treeView)
        {
            _Grupe = new List<Grupa>();
            _PodGrupe = new ObservableCollection<PodGrupa>();
            _PodGrupe.CollectionChanged += HandleChange;

            foreach (TreeNode n in treeView.Nodes)
            {
                if(n.Checked)
                {
                    foreach(TreeNode n1 in n.Nodes)
                    {
                        if(n1.Checked)
                            _PodGrupe.Add(new PodGrupa { GrupaId = (int)n.Tag, PodGrupaId = (int)n1.Tag });
                    }
                }
            }
        }

        public void Reset()
        {
            _Grupe = new List<Grupa>();
            _PodGrupe = new ObservableCollection<PodGrupa>();
        }
    }        

    public class Paket
    {
        public int PaketId;
        public int ProizvodId;
        public double CenaBezPdv;
        public double Kolicina;
    }
    #endregion

    private Proizvod()
    {
    }

    /// <summary>
    /// Kreira klasu sa podacima proizvoda sa web-a
    /// </summary>
    /// <param name="ROBAID">Unikatni ID za stavku/proizvod/robu</param>
    public Proizvod(int ROBAID)
    {
        if(ROBAID == null ) { throw new Exception("ROBAID ne moze biti NULL!"); }

        string url = "censoredLink";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        string resp = new StreamReader(response.GetResponseStream()).ReadToEnd();

        switch (resp)
        {
            case "0":  //Nije pronadjen proizvod
                _errorMessage = "Proizvod nije pronadjen u web bazi!";
                break;
            default:
                Proizvod p = JsonConvert.DeserializeObject<Proizvod>(resp);

                if(p == null)
                {
                    MessageBox.Show("Unhandled error!");
                    return;
                }

                this._PROIZVODID = p.PROIZVODID;
                this._NAZIV = p.NAZIV;
                this._OPIS = p.OPIS;
                this._JM = p.JM;
                this._AKCIJSKI_ARTIKAL = p.AKCIJSKI_ARTIKAL;
                this._AKTIVAN = p.AKTIVAN;
                this._KATBR = p.KATBR;
                this._PDV = p.PDV;
                this._SLIKA = p.SLIKA;
                this._KratakOpis = p.KratakOpis;
                this._GrupeIPodGrupe = new GrupeIPodgrupe(p.PROIZVODID);
                break;
        }
    }

    public Proizvod(int RobaId, string Naziv, string Opis, string Jm, bool AkcijskiArtikal, bool Aktivan, string KatBr, double PDV, string Slika, string KratakOpis, GrupeIPodgrupe gip, List<Paket> paketi, string fileNameSlika, string filePathSlika)
    {
        this._PROIZVODID = RobaId;
        this._NAZIV = Naziv;
        this._OPIS = Opis;
        this._JM = Jm;
        this._AKCIJSKI_ARTIKAL = (AkcijskiArtikal) ? 1 : 0;
        this._AKTIVAN = (Aktivan) ? 1 : 0;
        this._KATBR = KatBr;
        this._PDV = PDV;
        this._SLIKA = Slika;
        this._KratakOpis = KratakOpis;
        this._GrupeIPodGrupe = gip;
        this._Paketi = paketi;

        this.fileNameSlika = fileNameSlika;
        this.pathSlika = filePathSlika;
    }

    /// <summary>
    /// Updateuje trenutne vrednosti proizvoda na sajt!
    /// </summary>
    public void Update()
    {
        #region Proizvod table
        string url = String.Format("censoredLink");
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        string resp = new StreamReader(response.GetResponseStream()).ReadToEnd();

        switch (resp)
        {
            case "0":  //Nije pronadjen proizvod
                _errorMessage = "Doslo je do greske!";
                break;
            case "1":
                _errorMessage = "Uspesno updateovan prozvod na WEB-u";
                break;
            case "2":
                _errorMessage = "Proizvod sa tim ID-em nije pronadjen u bazi!";
                break;
            default:
                break;
        }
        #endregion

        DeGrupisi();
        Grupisi();
    }

    public void Publish()
    {
        PublishProizvod();
        Grupisi();
        PublishPakete();
        Thread t = new Thread(PublishSliku);
        t.Start();
    }

    public static List<Proizvod> SviProizvodi()
    {
        List<Proizvod> list = new List<Proizvod>();

        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

        string url = "censoredLink";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        string resp = new StreamReader(response.GetResponseStream()).ReadToEnd();

        switch (resp)
        {
            case "0":  //Nije pronadjen proizvod
                break;
            default:
                list = JsonConvert.DeserializeObject<List<Proizvod>>(resp);
                break;
        }
        return list;
    }

    /// <summary>
    /// Skida proizvodu bilo kakvu grupu i podgrupu
    /// </summary>
    private void DeGrupisi()
    {
        string url = "censoredLink";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        string resp = new StreamReader(response.GetResponseStream()).ReadToEnd();

        switch (resp)
        {
            case "0":
                _errorMessage = "Doslo je do greske prilikom brisanja proizvoda iz grupa i podgrupa";
                break;
            case "1":
                _errorMessage = "Uspesno degrupisani proizvodi!";
                break;
            default:
                _errorMessage = "Unhandled error";
                break;
        }
    }

    private void Grupisi()
    {
        foreach(PodGrupa pg in GrupeIPodGrupe.Podgrupe)
        {
            string url = string.Format("censoredLink");
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            string resp = new StreamReader(response.GetResponseStream()).ReadToEnd();

            switch (resp)
            {
                case "0":
                    _errorMessage = "Doslo je do greske prilikom grupisanja proizvoda";
                    break;
                case "1":
                    _errorMessage = "Proizvod je uspesno grupisan!";
                    break;
                case "2":
                    _errorMessage = "Proizvod je vec u grupi!";
                    break;
                default:
                    _errorMessage = "Unhandled error";
                    break;
            }
        }
    }

    private void PublishProizvod()
    {
        string url = string.Format("censoredLink");

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        string resp = new StreamReader(response.GetResponseStream()).ReadToEnd();

        switch (resp)
        {
            case "0":
                _errorMessage = "Doslo je do greske prilikom kreiranja proizvoda";
                break;
            case "1":
                _errorMessage = "Proizvod je uspesno kreiran!";
                break;
            case "2":
                _errorMessage = "Proizvod vec postoji u web bazi!";
                break;
            default:
                _errorMessage = "Unhandled error";
                break;
        }
    }

    private void PublishPakete()
    {
        foreach (Proizvod.Paket p in Paketi)
        {
            string url = string.Format("censoredLink");
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            string resp = new StreamReader(response.GetResponseStream()).ReadToEnd();

            switch (resp)
            {
                case "0":
                    _errorMessage = "Doslo je do greske prilikom dodavanja paketa";
                    break;
                case "1":
                    _errorMessage = "Paketi uspesno dodati!";
                    break;
                default:
                    _errorMessage = "Unhandled error";
                    break;
            }
        }
    }

    private void PublishSliku()
    {
        if (!string.IsNullOrWhiteSpace(_SLIKA))
        {
            M.preventClosing = true;
            MessageBox.Show("Dodavanje slike ce potrajati i zavisi od brzine interneta koju imate i nece vam dozvoliti zatvaranje programa!\nDodavanje slike se vrsi u pozadini te mozete nastaviti sa radom u programu!");
            using (WebClient client = new WebClient())
            {
                client.Credentials = new NetworkCredential("username", "password");
                client.UploadFile("censoredLink");
            }
            M.preventClosing = false;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您的代码正在呼叫:

proizvod.GrupeIPodGrupe.Reset()

正在清空ObservableCollection