private void removeRow(TreeNode Node)
        {
            string name  = Node.Name;
            string type  = name.Substring(0, 1);
            Int32  value = Int32.Parse(name.Substring(1));


            int cateId   = 0;
            int optionId = 0;
            int detailId = 0;
            //Remove List OptionCategories
            var item = getOptionBase(Node.Name, Node.Text);

            if (item != null)
            {
                if (item.GetType() == typeof(SCOptionCategory))
                {
                    cateId = item.OID;
                    listOptionDetail.RemoveAll(x => x.OptionCategoryOID == item.OID && x.OptionOID <= 0 && x.OptionDetailOID <= 0);
                }
                else if (item.GetType() == typeof(SCOption))
                {
                    TreeNode parent = Node.Parent;
                    cateId = Int32.Parse(parent.Name.Substring(1));
                    SCOption option = (SCOption)item;
                    optionId = option.OID;
                    listOptionDetail.RemoveAll(x => x.OptionCategoryOID == cateId && x.OptionOID == option.OID && x.OptionDetailOID <= 0);
                }
                else
                {
                    TreeNode scOption = Node.Parent;
                    optionId = Int32.Parse(scOption.Name.Substring(1));

                    TreeNode scCate = scOption.Parent;
                    cateId = Int32.Parse(scCate.Name.Substring(1));

                    SCOptionDetail detail = (SCOptionDetail)item;
                    detailId = detail.OID;
                    listOptionDetail.RemoveAll(x => x.OptionCategoryOID == cateId && x.OptionOID == optionId && x.OptionDetailOID == detail.OID);
                }

                removeFromDic(Node);

                //Xoa grid
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    DataRow recRow = dataTable.Rows[i];
                    if (cateId.Equals(recRow["OptionCategoryOID"]) &&
                        optionId.Equals(recRow["OptionOID"]) &&
                        detailId.Equals(recRow["OptionDetailOID"]))
                    {
                        recRow.Delete();
                        dataTable.AcceptChanges();
                        break;
                    }
                }
            }
        }
        public SCOptionBase getOptionBase(string name, string text)
        {
            string type  = name.Substring(0, 1);
            Int32  value = Int32.Parse(name.Substring(1));

            if (type.Equals("C"))
            {
                return(SCOptionCategory.getByOID(value));
            }
            else if (type.Equals("O"))
            {
                return(SCOption.getByOID(value));
            }
            else
            {
                return(SCOptionDetail.getByOID(value));
            }
        }
        private void addRow(TreeNode Node)
        {
            var item = getOptionBase(Node.Name, Node.Text);

            if (item != null)
            {
                //Add List OptionCategories
                ContractOption rtn = null;
                if (item.GetType() == typeof(SCOptionCategory))
                {
                    SCOptionCategory catetory = (SCOptionCategory)item;
                    rtn = new ContractOption();
                    rtn.OptionCategoryOID = item.OID;
                    rtn.Name           = item.Name;
                    rtn.PartNr         = item.ItemNo;
                    rtn.PartName       = item.ItemName;
                    rtn.LabourCode     = item.WrksId;
                    rtn.LabourName     = item.WrksName;
                    rtn.BaseSelPr      = item.SelPr;
                    rtn.PurchasePr     = item.BuyPr;
                    rtn.BasePurchasePr = item.BuyPr;
                    rtn.InvoiceFlag    = catetory.InvoiceFlag;
                }
                else if (item.GetType() == typeof(SCOption))
                {
                    rtn = new ContractOption();
                    TreeNode parent = Node.Parent;
                    Int32    cateId = Int32.Parse(parent.Name.Substring(1));
                    SCOption option = (SCOption)item;
                    rtn.OptionCategoryOID = cateId;
                    rtn.OptionOID         = option.OID;
                    rtn.Name           = option.Name;
                    rtn.PartNr         = option.ItemNo;
                    rtn.PartName       = option.ItemName;
                    rtn.LabourCode     = option.WrksId;
                    rtn.LabourName     = option.WrksName;
                    rtn.BaseSelPr      = option.SelPr;
                    rtn.PurchasePr     = option.BuyPr;
                    rtn.BasePurchasePr = option.BuyPr;
                }
                else
                {
                    rtn = new ContractOption();
                    TreeNode scOption  = Node.Parent;
                    Int32    optionOID = Int32.Parse(scOption.Name.Substring(1));

                    TreeNode scCate  = scOption.Parent;
                    Int32    cateOID = Int32.Parse(scCate.Name.Substring(1));

                    SCOptionDetail detail = (SCOptionDetail)item;

                    rtn.OptionCategoryOID = cateOID;
                    rtn.OptionOID         = optionOID;
                    rtn.OptionDetailOID   = detail.OID;
                    rtn.Name           = detail.Name;
                    rtn.PartNr         = detail.ItemNo;
                    rtn.PartName       = detail.ItemName;
                    rtn.LabourCode     = detail.WrksId;
                    rtn.LabourName     = detail.WrksName;
                    rtn.BaseSelPr      = detail.SelPr;
                    rtn.PurchasePr     = detail.BuyPr;
                    rtn.BasePurchasePr = detail.BuyPr;
                }


                if (rtn != null)
                {
                    rtn.ContractOID = ContractFrm.objContract.ContractOID;
                    //Update info
                    try
                    {
                        ContractOption finded = ContractFrm.objContract.listContractOptions.Single(s => s.OptionCategoryOID == rtn.OptionCategoryOID && s.OptionOID == rtn.OptionOID && s.OptionDetailOID == rtn.OptionDetailOID);
                        rtn.Info         = finded.Info;
                        rtn.PartialPayer = finded.PartialPayer;
                        rtn.Quantity     = finded.Quantity;
                        if (finded.SalePr <= 0 && rtn.BaseSelPr > 0)
                        {
                            rtn.SalePr = rtn.BaseSelPr;
                        }
                        else
                        {
                            rtn.SalePr = finded.SalePr;
                        }
                        rtn.PurchasePr = finded.PurchasePr;
                        //rtn.BaseSelPr = finded.BaseSelPr;
                    }
                    catch (System.InvalidOperationException ex)
                    {
                        rtn.Quantity   = 1;
                        rtn.SalePr     = rtn.BaseSelPr;
                        rtn.PurchasePr = rtn.BasePurchasePr;
                        _log.Error("ContractFrm.objContract.listContractOptions Single not contain exactly one element: " + rtn.toString(), ex);
                    }

                    if (!listOptionDetailTmp.ContainsKey(Node.Name))
                    {
                        addToDic(rtn);
                    }

                    //Add to grid
                    try
                    {
                        ContractOption finded = listOptionDetail.Single(s => s.OptionCategoryOID == rtn.OptionCategoryOID && s.OptionOID == rtn.OptionOID && s.OptionDetailOID == rtn.OptionDetailOID);
                        finded.Info         = rtn.Info;
                        finded.PartialPayer = rtn.PartialPayer;
                        finded.Quantity     = rtn.Quantity;
                        finded.SalePr       = rtn.SalePr;
                        finded.BaseSelPr    = rtn.BaseSelPr;
                        finded.PurchasePr   = rtn.PurchasePr;
                    }
                    catch (System.InvalidOperationException ex)
                    {
                        _log.Error("listOptionDetail Single not contain exactly one element: " + rtn.toString(), ex);

                        //Add to list
                        listOptionDetail.Add(rtn);

                        //Add to grid
                        DataRow drToAdd = ObjectUtils.FillDataToRow(dataTable.NewRow(), rtn);
                        dataTable.Rows.Add(drToAdd);
                    }
                }
            }
        }