mohamed ahmed

mohamed ahmed

  • 1.7k
  • 43
  • 2.9k

Error :System.NullReferenceException: image was null. ?

Oct 16 2022 7:05 PM

trying to add Product to database ? i got "Error :at : image.Save(stream, ImageFormat.Jpeg); :System.NullReferenceException: image was null "

note :when i add First product record nothing happen ..

using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraGrid.Views.Grid;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static visionfinance.Class.Master;


namespace visionfinance.Forms
{
    public partial class frm_Product : Frm_Master
    {
        private DAL.Product product;
        private RepositoryItemLookUpEdit repoUOM = new RepositoryItemLookUpEdit();
        private DAL.dbDataContext sdb = new DAL.dbDataContext();
        public frm_Product()
        {
            InitializeComponent();
            RefreshData();
            New();
        }
        public frm_Product(int id)
        {
            InitializeComponent();
            RefreshData();
            LoadProduct(id);
        }

        private void LoadProduct(int id)
        {
            using (var db = new DAL.dbDataContext())
            {
                product = db.Products.Single(x => x.ID == id);

            }
            this.Text = string.Format("?????? ??? : {0}", product.Name);
            GetData();
        }
        public override void New()
        {
            product = new DAL.Product()
            {
                Code = GetNewProductCode()
            , IsActive = true,
            };
            var db = new DAL.dbDataContext();
            var categ = db.ProductCategories
                    .Where(x => db.ProductCategories.Where(w => w.ParentID == x.ID).Count() == 0).FirstOrDefault();
            if (categ != null)
                product.CategoryID = categ.ID;
            base.New();
            this.Text = "????? ??? ????";
            var data = gridView1.DataSource as BindingList<DAL.ProductUnit>;

            if (db.UnitNames.Count() == 0)
            {
                db.UnitNames.InsertOnSubmit(new DAL.UnitName() { Name = "????" });
                db.SubmitChanges();
                RefreshData();
            }
            data.Add(new DAL.ProductUnit() { Factor = 1, UnitID = db.UnitNames.First().ID, Barcode = GetNewBarcode() });
        }
        public override void GetData()
        {
            txt_Code.Text = product.Code;
            txt_Name.Text = product.Name;
            lkp_Category.EditValue = product.CategoryID;
            lkp_Type.EditValue = product.Type;
            memoEdit1.Text = product.Descreption;
            checkEdit1.Checked = product.IsActive;
            if (product.Image != null)
                pictureEdit1.Image = GetImageFromByteArray(product.Image.ToArray());
            else
                pictureEdit1.Image = null;
            gridControl1.DataSource = sdb.ProductUnits.Where(x => x.ProductID == product.ID);


            base.GetData();
        }
        public override void SetData()
        {
            product.CategoryID = Convert.ToInt32(lkp_Category.EditValue);
            product.Code = txt_Code.Text;
            product.Name = txt_Name.Text;
            product.Type = Convert.ToByte(lkp_Type.EditValue);
            product.IsActive = checkEdit1.Checked;
            product.Image = GetByteFromImage(pictureEdit1.Image);

            base.SetData();
        }
        private Byte[] GetByteFromImage(Image image)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                try
                {
                    image.Save(stream, ImageFormat.Jpeg);
                    return stream.ToArray();
                }
                catch
                {
                    return stream.ToArray();
                }

            }
        }

        private Image GetImageFromByteArray(Byte[] ByteArray)
        {
            Image img;
            try
            {
                Byte[] imgbyte = ByteArray;
                MemoryStream stream = new MemoryStream(imgbyte, false);
                img = Image.FromStream(stream);
            }
            catch { img = null; }
            return img;
        }
        private bool ValdiateData()
        {
            if (lkp_Category.EditValue is int == false || Convert.ToInt32(lkp_Category.EditValue) <= 0)
            {
                lkp_Category.ErrorText = ErrorText;
                return false;
            }
            if (lkp_Type.EditValue is byte == false)
            {
                lkp_Type.ErrorText = ErrorText;
                return false;
            }
            if (txt_Name.Text.Trim() == string.Empty)
            {
                txt_Name.ErrorText = ErrorText;
                return false;
            }
            if (txt_Code.Text.Trim() == string.Empty)
            {
                txt_Code.ErrorText = ErrorText;
                return false;
            }
            var db = new DAL.dbDataContext();
            if (db.Products.Where(x => x.ID != product.ID && x.Name.Trim() == txt_Name.Text.Trim()).Count() > 0)
            {
                txt_Name.ErrorText = "??? ????? ???? ??????";
                return false;
            }
            if (db.Products.Where(x => x.ID != product.ID && x.Code.Trim() == txt_Code.Text.Trim()).Count() > 0)
            {
                txt_Code.ErrorText = "??? ????? ???? ??????";
                return false;
            }

            return true;
        }
        public override void Save()
        {
            if (ValdiateData() == false)
                return;
            var db = new DAL.dbDataContext();

            if (product.ID == 0)
                db.Products.InsertOnSubmit(product);
            else
                db.Products.Attach(product);

            SetData();
            db.SubmitChanges();
            var data = gridView1.DataSource as BindingList<DAL.ProductUnit>;
            foreach (var item in data)
            {
                item.ProductID = product.ID;
                if (string.IsNullOrEmpty(item.Barcode))
                    item.Barcode = "";
            }
            sdb.SubmitChanges();
            base.Save();
            this.Text = string.Format("?????? ??? : {0}", product.Name);
            frm_ProductList frm = new frm_ProductList();
            frm.RefreshData();

        }

        private void frm_Product_Load(object sender, EventArgs e)
        {
            Refresh();
            lkp_Category.Properties.DisplayMember = "Name";
            lkp_Category.Properties.ValueMember = "ID";
            lkp_Category.ProcessNewValue += Lkp_Category_ProcessNewValue;
            lkp_Category.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;

            lkp_Type.Properties.DataSource = ProductTypesList;
            lkp_Type.Properties.DisplayMember = "Name";
            lkp_Type.Properties.ValueMember = "ID";

            gridView1.OptionsView.ShowGroupPanel = false;
            gridView1.OptionsView.NewItemRowPosition = DevExpress.XtraGrid.Views.Grid.NewItemRowPosition.Top;

            gridView1.Columns[nameof(ins.ID)].Visible = false;
            gridView1.Columns[nameof(ins.ProductID)].Visible = false;
            RepositoryItemCalcEdit calcEdit = new RepositoryItemCalcEdit();

            gridControl1.RepositoryItems.Add(calcEdit);
            gridControl1.RepositoryItems.Add(repoUOM);

            gridView1.Columns[nameof(ins.SellPrice)].ColumnEdit = calcEdit;
            gridView1.Columns[nameof(ins.BuyPrice)].ColumnEdit = calcEdit;
            gridView1.Columns[nameof(ins.SellDiscount)].ColumnEdit = calcEdit;
            gridView1.Columns[nameof(ins.Factor)].ColumnEdit = calcEdit;
            gridView1.Columns[nameof(ins.UnitID)].ColumnEdit = repoUOM;

            gridView1.Columns[nameof(ins.Barcode)].Caption = "????????";
            gridView1.Columns[nameof(ins.BuyPrice)].Caption = "??? ??????";
            gridView1.Columns[nameof(ins.Factor)].Caption = "????? ???????";
            gridView1.Columns[nameof(ins.SellDiscount)].Caption = "??? ?????";
            gridView1.Columns[nameof(ins.SellPrice)].Caption = "??? ?????";
            gridView1.Columns[nameof(ins.UnitID)].Caption = "??? ??????";

            repoUOM.ValueMember = "ID";
            repoUOM.DisplayMember = "Name";
            repoUOM.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;

            repoUOM.ProcessNewValue += RepoUOM_ProcessNewValue;

            gridView1.ValidateRow += GridView1_ValidateRow;
            gridView1.InvalidRowException += GridView1_InvalidRowException;
            gridView1.FocusedRowChanged += GridView1_FocusedRowChanged;
            gridView1.CustomRowCellEditForEditing += GridView1_CustomRowCellEditForEditing;
        }

        private void GridView1_CustomRowCellEditForEditing(object sender, CustomRowCellEditEventArgs e)
        {
            if (e.Column.FieldName == nameof(ins.UnitID))
            {
                var ids = ((Collection<DAL.ProductUnit>)gridView1.DataSource).Select(x => x.UnitID).ToList();
                RepositoryItemLookUpEdit repo = new RepositoryItemLookUpEdit();
                using (var db = new DAL.dbDataContext())
                {
                    var currentID = (int?)e.CellValue;
                    ids.Remove(currentID ?? 0);
                    repo.DataSource = db.UnitNames.Where(x => ids.Contains(x.ID) == false).ToList();
                    repo.ValueMember = "ID";
                    repo.DisplayMember = "Name";
                    repo.PopulateColumns();
                    repo.Columns["ID"].Visible = false;
                    repo.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;
                    repo.ProcessNewValue += RepoUOM_ProcessNewValue;
                    e.RepositoryItem = repo;
                }
                // select * from xxx where id not  in(5,65,6.56)
            }
        }

        private void GridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            gridView1.Columns[nameof(ins.Factor)].OptionsColumn.AllowEdit = !(e.FocusedRowHandle == 0);
        }

        private void GridView1_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction;
        }

        private void GridView1_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            var row = e.Row as DAL.ProductUnit;
            var view = sender as GridView;
            if (row == null)
                return;
            if (row.Factor <= 1 && e.RowHandle != 0)
            {
                e.Valid = false;
                view.SetColumnError(view.Columns[nameof(row.Factor)], "??? ?? ???? ?????? ???? ?? 1 ");
            }
            if (row.UnitID <= 0)
            {
                e.Valid = false;
                view.SetColumnError(view.Columns[nameof(row.UnitID)], ErrorText);
            }
            if (CheckIfBarcodeExist(row.Barcode, prdID: product.ID))
            {
                e.Valid = false;
                view.SetColumnError(view.Columns[nameof(row.Barcode)], " ??? ????? ????? ?????? ");
            }
        }

        private void RepoUOM_ProcessNewValue(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e)
        {
            if (e.DisplayValue is string value && value.Trim() != string.Empty)
            {
                var NewObject = new DAL.UnitName() { Name = value.Trim() };
                using (DAL.dbDataContext db = new DAL.dbDataContext())
                {
                    db.UnitNames.InsertOnSubmit(NewObject);
                    db.SubmitChanges();
                }
                 ((List<DAL.UnitName>)repoUOM.DataSource).Add(NewObject);
                ((List<DAL.UnitName>)(((LookUpEdit)sender).Properties.DataSource)).Add(NewObject);
                e.Handled = true;

            }
        }

        public override void Refresh()
        {
            using (var db = new DAL.dbDataContext())
            {
                lkp_Category.Properties.DataSource = db.ProductCategories
                    .Where(x => db.ProductCategories.Where(w => w.ParentID == x.ID).Count() == 0).ToList();
                repoUOM.DataSource = db.UnitNames.ToList();
            }
            base.Refresh();
        }
        private DAL.ProductUnit ins = new DAL.ProductUnit();

        private void Lkp_Category_ProcessNewValue(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e)
        {
            if (e.DisplayValue is string st && st.Trim() != string.Empty)
            {
                var newObject = new DAL.ProductCategory() { Name = st, ParentID = 0, Number = "0" };
                using (var db = new DAL.dbDataContext())
                {
                    db.ProductCategories.InsertOnSubmit(newObject);
                    db.SubmitChanges();
                }
               ((List<DAL.ProductCategory>)lkp_Category.Properties.DataSource).Add(newObject);
                e.Handled = true;

            }
            

        }
        private string GetNewProductCode()
        {
            string maxCode;
            using (var db = new DAL.dbDataContext())
            {
                maxCode = db.Products.Select(x => x.Code).Max();
            }

            return GetNextNumberInString(maxCode);
        }

        private string GetNewBarcode()
        {
            string maxCode;
            using (var db = new DAL.dbDataContext())
            {
                maxCode = db.ProductUnits.Select(x => x.Barcode).Max();
            }

            return GetNextNumberInString(maxCode);
        }

        private bool CheckIfBarcodeExist(string barcode, int prdID)
        {
            using (var db = new DAL.dbDataContext())
                return db.ProductUnits.Where(x => x.Barcode == barcode && x.ProductID != prdID).Count() > 0;

        }

        private void gridControl1_Click(object sender, EventArgs e)
        {

        }
    }
}

 


Answers (1)