public int CapNhapChiTietPhieuXuat(DataTable dt, string maPhieu, clsPhieuXuatTamVatTu phieuxuat)
        {
            this.new_dt = null;
            this.old_dt = null;
            this.dt_TonKho = null;
            this.dt_TheKho = null;

            this.maPhieu = maPhieu;
            this.Ngay_xuat = phieuxuat.Ngay_xuat;
            this.ID_nhan_vien = phieuxuat.ID_Nhan_vien;
            //phieuxuat.

            //Dùng cho xét nợ VT giữa các kho
            ID_Kho_Xuat = phieuxuat.ID_kho;

            //B1: Get về dt vt theo mã phiếu có trong DB
            this.old_dt = GetDataTable(maPhieu);
            this.new_dt = dt.Copy();

            //Cache tồn kho
            this.dt_TonKho = getAll_Ton_kho(new_dt);
            this.dt_TheKho = getAll_TheKho(new_dt);
            //dt_TheKho =

            //BeginTransaction
            SqlTransaction m_trans = null;

            SqlConnection m_conn = new SqlConnection(clsThamSoUtilities.connectionString);
            try
            {
                if (m_conn.State == ConnectionState.Closed)
                    m_conn.Open();

                m_trans = m_conn.BeginTransaction();

                //Cập nhật phiếu xuất --> phần header
                if (phieuxuat.CapNhapPhieuXuat(m_trans, m_conn) == -1)
                {
                    m_trans.Rollback();
                    m_conn.Close();
                    return -1;
                }

                //Cập nhật phần chi tiết trên grid

                //Nếu mã phiếu này chưa có trong DB, thêm mới tất cả.
                if (old_dt.Rows.Count == 0)
                {
                    for (int i = 0; i < new_dt.Rows.Count; i++)
                    {
                        if (Insert_row(i, m_trans, m_conn) == -1)
                        {
                            m_trans.Rollback();
                            m_conn.Close();
                            return -1;
                        }
                    }

                    m_trans.Commit();
                    m_conn.Close();
                    return 1;
                } //End Insert mới

                //Nếu đã có trong DB, cập nhật theo table mới --> update cái đã có, insert cái chưa có
                //Chuyển sang dùng ID để quyết định Insert hay Update
                for (int i = 0; i < new_dt.Rows.Count; i++)
                {
                    DataRow selectedRow = new_dt.Rows[i];
                    int id = Int32.Parse(selectedRow["ID_chi_tiet_phieu_xuat_tam"].ToString());
                    if (id == -1)
                    {
                        if (Insert_row(i, m_trans, m_conn) == -1)
                        {
                            m_trans.Rollback();
                            m_conn.Close();
                            return -1;
                        }
                    }
                    else
                    {
                        DataRow[] KiemTra = old_dt.Select(string.Format("ID_chi_tiet_phieu_xuat_tam='{0}'", id));
                        if (Update_row(i, KiemTra[0], m_trans, m_conn) == -1)
                        {
                            m_trans.Rollback();
                            m_conn.Close();
                            return -1;
                        }
                        old_dt.Rows.Remove(KiemTra[0]);
                    }
                }

                //Xử lý Xóa row ko có trong table mới
                if (old_dt.Rows.Count == 0)
                {
                    m_trans.Commit();
                    m_conn.Close();

                    return 1;
                }

                for (int i = 0; i < old_dt.Rows.Count; i++)
                {
                    if (Delete_row(i, m_trans, m_conn) == -1)
                    {
                        m_trans.Rollback();
                        m_conn.Close();
                        return -1;
                    }
                }

                m_trans.Commit();
                m_conn.Close();

                return 1;
            }
            catch (Exception ex)
            {

                m_trans.Rollback();
                return -1;
                throw ex;
            }
            finally
            {
                if (m_conn.State != ConnectionState.Closed)
                    m_conn.Close();
            }
        }