public override void SaveChanges(bool notifyUser)
        {
            paymentsDataGridView.EndEdit();

            if (_dataChanged && paymentsDataGridView.Columns.Count > 4)
            {
                if (notifyUser && DialogResult.No == MessageBox.Show(WindowMessages.SAVE_OR_DISCARD_CHANGES_MSG,
                                                                     WindowMessages.SAVE_OR_DISCARD_CHANGES_TITLE,
                                                                     MessageBoxButtons.YesNo,
                                                                     MessageBoxIcon.Warning))
                {
                    ClearChanges();
                    return;
                }

                using (var db = new FeeStatusesDBContext())
                {
                    foreach (int rowIndex in _changedCells.Keys)
                    {
                        var    changedRow = paymentsDataGridView.Rows[rowIndex].DataBoundItem as DataRowView;
                        string rowId      = changedRow.Row.ItemArray[1].ToString();

                        foreach (int colIndex in _changedCells[rowIndex])
                        {
                            short changedColName = short.Parse(paymentsDataGridView.Columns[colIndex].HeaderText);
                            //YearXXXX

                            FeeLogs log = db.Member.Find(rowId).FeeLogs.SingleOrDefault(l => l.Year == changedColName);
                            if (log != null)
                            {
                                log.PaymentStatusID = (int)changedRow.Row.ItemArray[colIndex];
                            }
                            else
                            {
                                db.FeeLogs.Add(new FeeLogs
                                {
                                    VulkanID        = rowId,
                                    Year            = changedColName,
                                    PaymentStatusID = (int)changedRow.Row.ItemArray[colIndex]
                                }
                                               );
                            }
                        }
                    }

                    int result = db.SaveChanges();
                }

                ClearChanges();
                NotifyDependantControlsOfChanges();
            }
        }
        public void BindPaymentsDataGridView(bool onlyMustPayers, bool includeDeleted)
        {
            paymentsDataGridView.CellValueChanged -= PaymentsDataGridView_CellValueChanged;

            using (var db = new FeeStatusesDBContext())
            {
                var members =
                    db.Member.
                    Where(m => !onlyMustPayers || m.MustPay).
                    Where(m => m.Active || includeDeleted).
                    OrderBy(m => m.Surname).
                    ThenBy(m => m.Name);

                var feeLogs = members.SelectMany(m => m.FeeLogs).ToList();

                var paymentStatuses     = db.PaymentStatus.ToList();
                IEnumerable <int> years = null;
                if (feeLogs.Count > 0)
                {
                    int maxYear = feeLogs.Max(l => l.Year);
                    int minYear = feeLogs.Min(l => l.Year);

                    years = Enumerable.Range(minYear, maxYear - minYear + 1);
                    DataGridViewComboBoxColumn col;
                    foreach (int year in years)
                    {
                        if (!paymentsDataGridView.Columns.Contains("Year" + year))
                        {
                            col = new DataGridViewComboBoxColumn
                            {
                                DataSource       = paymentStatuses,
                                Name             = "Year" + year,
                                HeaderText       = year.ToString(),
                                DisplayMember    = "Text",
                                ValueMember      = "PaymentStatusID",
                                DataPropertyName = "Year" + year,
                                FlatStyle        = FlatStyle.Flat
                            };
                            paymentsDataGridView.Columns.Add(col);
                        }
                    }
                }

                // create a DataTable to hold our data ...
                DataTable dt = CreateDataTable(years);

                object[] values;
                foreach (Member member in members)
                {
                    values =
                        years != null
                            ? new object[5 + years.Count()]
                            : new object[5];

                    values[0] = member.Active;
                    values[1] = member.VulkanID;
                    values[2] = member.Surname;
                    values[3] = member.Name;
                    values[4] = string.Format("{0} ({1} let)", member.DateOfBirth.ToString("dd.MM.yyyy"), member.GetMemberAgeForCurrentYear());

                    if (years != null)
                    {
                        int i = 0;
                        foreach (int year in years)
                        {
                            FeeLogs log = member.FeeLogs.FirstOrDefault(l => l.Year == year);
                            values[5 + i] =
                                log != null
                                    ? log.PaymentStatusID
                                    : PaymentStatus.NI_PODATKA;
                            i++;
                        }
                    }

                    dt.Rows.Add(values);
                }

                paymentsDataGridView.DataSource = dt;
                ClearSelection(paymentsDataGridView);
            }

            paymentsDataGridView.CellValueChanged += PaymentsDataGridView_CellValueChanged;
        }
        private void ImportPaymentHistory(string fullFilePath)
        {
            string line;
            var    file = new StreamReader(fullFilePath, Encoding.UTF8);

            try
            {
                using (var db = new FeeStatusesDBContext())
                {
                    while ((line = file.ReadLine()) != null)
                    {
                        string[] lineData = line.Split(';');

                        short  year   = 2001;
                        Member member = db.Member.Find(lineData[0]);
                        if (member != null && member.Gender) // moski
                        {
                            for (int i = 8; i < 20; i++)
                            {
                                string stat = lineData[i];
                                var    log  = new FeeLogs
                                {
                                    Member = member,
                                    Year   = year
                                };

                                switch (stat)
                                {
                                case "DA":
                                    log.PaymentStatusID = PaymentStatus.PLACAL;
                                    break;

                                case "NE":
                                    log.PaymentStatusID = PaymentStatus.NI_PLACAL;
                                    break;

                                case "VETERAN":
                                    log.PaymentStatusID = PaymentStatus.VETERAN;
                                    break;

                                case "XXX":
                                    log.PaymentStatusID = PaymentStatus.MLADOLETNIK;
                                    break;

                                default:
                                    if (member.GetMemberAgeForYear(year) < 18)
                                    {
                                        log.PaymentStatusID = PaymentStatus.MLADOLETNIK;
                                    }
                                    else if (member.GetMemberAgeForYear(year) >= 60)
                                    {
                                        log.PaymentStatusID = PaymentStatus.VETERAN;
                                    }
                                    else
                                    {
                                        log.PaymentStatusID = PaymentStatus.NI_PODATKA;
                                    }
                                    break;
                                }

                                member.FeeLogs.Add(log);
                                year++;
                            }
                        }
                    }

                    db.SaveChanges();
                }
            }
            catch (DbEntityValidationException e)
            {
                foreach (DbEntityValidationResult eve in e.EntityValidationErrors)
                {
                    Debug.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                                    eve.Entry.Entity.GetType().Name, eve.Entry.State);
                    foreach (DbValidationError ve in eve.ValidationErrors)
                    {
                        Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                                        ve.PropertyName, ve.ErrorMessage);
                    }
                }
                throw;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.StackTrace);
            }

            BindPaymentsDataGridView(onlyMustPayers, includeDeleted);
        }