DevExpress的項目總結:A138箱碼內標碼覈對系統

該系統一共三個窗體:

1、清單界面:

這個界面主要做了三個事件:

一是點查詢的時候按照文本框的單號和返工日期進行模糊查詢;

二是點擊新增的時候在主窗體添加一個新的頁籤,如果已經添加過,不再重複添加,並把當前頁面切換成新頁籤。

這個過程中涉及到一個單號自動取號的問題,這裏會涉及到單號的鎖定和解鎖的問題,我是直接在新增的時候就把單號插入到數據庫的主表中,如果沒有保存,再把這一行記錄刪除。要注意的地方是:每段語法都需要寫try{}catch{},因爲如果系統意外退出的話數據庫會有垃圾數據。其實這段這樣做是不太對的,就是會有不可預估的情況導致產生垃圾數據。正確的鎖定單號的方法應該是在緩存中鎖定,在中間層,這方面我暫時還沒有研究,等後續把這一塊的知識逐漸完善起來。但是我目前的做法其實沒有解決單據跳號的問題,如果存在多人編輯,並且有人取消編輯,就會出現跳號的問題。

三是點擊GridControl的第一列的時候,打開對應行項單據的窗體,查看單據內容。頁簽名稱會顯示單號,如果單號已經打開過不重複打開。並跳轉頁面至該單號的頁籤。

這塊涉及到一個點就是GridControl在綁定數據源之後,怎麼再添加一個Button列的問題。這段值得記錄一下。(但是目前我還沒做出來把多個按鈕放在一列的方法,下面的方法是一個按鈕一列)

//首先定義一個全局的ButtonEdit列
 private RepositoryItemButtonEdit btn_Edit = new RepositoryItemButtonEdit();
//然後定義一個函數設置ButtonEdit列的屬性(在這裏我的編輯其實沒用到,被我註釋掉了)
 private void SetButtonEdit(RepositoryItemButtonEdit btn, string ImageName)
{
    btn.Buttons[0].Kind = ButtonPredefines.Glyph;
    btn.TextEditStyle = TextEditStyles.HideTextEditor;//隱藏文字
    if (string.IsNullOrEmpty(ImageName)) return;
    if (ImageName.Equals("查看"))
        btn.Buttons[0].ImageUri = "Find;Size16x16";//圖片-查看
    else if (ImageName.Equals("編輯"))
         btn.Buttons[0].ImageUri = "Edit;Size16x16";//圖片-編輯
}
//然後在主函數中調用這個函數以及這個按鈕的點擊事件
public Form_ReworkListSel(Form_Main fmz)
{
      InitializeComponent();
      fm = fmz;
      SetButtonEdit(btn_Open, "查看");
      //SetButtonEdit(btn_Edit, "編輯");
      btn_Open.Click += btn_Open_Click;
      //btnDelete.Click += BtnClick;
}
//然後把按鈕列添加到GridControl中
          private void GV_CustomRowCellEdit(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e)
        {
            if (e.Column.GetTextCaption() == "查看")
            {
                e.RepositoryItem = btn_Open;
            }
            else if (e.Column.GetTextCaption() == "編輯")
            {
                e.RepositoryItem = btn_Edit;
            }
        }
//下面是按鈕的點擊事件
         private void btn_Open_Click(object sender, EventArgs e)
        {
            bool bzj = false;
            if (fm.tabs.Controls.Count != 0)
            {
                foreach (XtraTabPage page in fm.tabs.TabPages)
                {
                    if (page.Name =="page_"+GV.GetRowCellValue(GV.FocusedRowHandle, "返工單號"))
                    {
                        bzj = true;
                        fm.tabs.SelectedTabPage = page;
                        return;
                    }
                }
            }
            if (bzj == false)
            {
                XtraTabPage tabFrmLog = new XtraTabPage();
                tabFrmLog.Text = "返工單 : " + GV.GetRowCellValue(GV.FocusedRowHandle, "返工單號");
                tabFrmLog.Name = "page_" + GV.GetRowCellValue(GV.FocusedRowHandle, "返工單號");

                //初始化登錄界面
                Form_ReworkListOpen Form_ReworkListOpen = new Form_ReworkListOpen(fm);
                Form_ReworkListOpen.MdiParent = fm;
                Form_ReworkListOpen.Parent = tabFrmLog;
                Form_ReworkListOpen.Dock = DockStyle.Fill;
                Form_ReworkListOpen.FormBorderStyle = FormBorderStyle.None;
                Form_ReworkListOpen.txt_BillNo.Text = GV.GetRowCellValue(GV.FocusedRowHandle, "返工單號").ToString();
                Form_ReworkListOpen.txt_BillDate.EditValue = GV.GetRowCellValue(GV.FocusedRowHandle, "返工日期");
                sql = "select BillNo 返工單號,CustomerName 客戶,OuterBoxCode 外箱碼,ProductCode 產品碼 , BoxQty 箱數, ProductQty 產品數  from A138_ReworkListDetail where BillNo = '"+ GV.GetRowCellValue(GV.FocusedRowHandle, "返工單號").ToString().Trim()+ "'";
                DataTable ds;
                if (!DB.AF.execSql(sql, sqlconn, out ds))
                {
                    return;
                }
                Form_ReworkListOpen.gridControl1.DataSource = ds;
                Form_ReworkListOpen.Show();
                //子窗體大小設置爲選項卡大小
                fm.tabs.TabPages.Add(tabFrmLog);
                fm.tabs.SelectedTabPage = tabFrmLog;
            }

        }

2.新增界面:

新增的頁面做的事情就比較多,包括一系列值的判斷以及操作。值得一提的有幾點:一是窗體關閉的時候關閉頁籤,其實這個方法挺簡單的,但是我可能是當時寫代碼寫暈了,然後這個小方法還是想了挺久的,所以記錄一下。想想好丟人,一點技術含量都沒有,但是我當時我就糊塗了,我就一直想着怎麼得到頁籤的index(手動狗頭)

      private void btnCancel_Click(object sender, EventArgs e)
        {
            foreach (XtraTabPage page in fm.tabs.TabPages.ToArray())//遍歷得到和關閉的選項卡一樣的Text
            {
                if (page.Text == "返工單新增")
                {
                    fm.tabs.TabPages.Remove(page);
                }
            }
            if (!unlockBillNo())
            {
                MessageBox.Show("返工單號:" + txt_BillNo.Text + "解鎖失敗!");
                return;
            }
        }
     private bool unlockBillNo()
        {
            SqlConnection sqlCnt = new SqlConnection(sqlconn);
            sqlCnt.Open();
            SqlCommand command = new SqlCommand();
            command.Connection = sqlCnt;
            command.CommandType = CommandType.Text;
            command.CommandText = "delete from A138_ReworkListMain where BillNo = @BillNo";
            command.Parameters.Add("@BillNo", SqlDbType.VarChar, 12).Value = txt_BillNo.Text.Trim();
            command.ExecuteNonQuery();
            sqlCnt.Close();
            return true;
        }

二是要提一下的就是GridControl和DataGridview不太一樣的一點是,GridControl在沒綁定數據源的時候是不能新增行項的,所以這邊用了個虛表,先在虛表中插入字段,然後再把虛表賦值給GridControl的數據源。

 private void AddRow()
        {
            int BQty = 1;
            DataRow[] BoxQty = sesstab.Select("外箱碼 = '" + txt_OuterBoxCode.Text.Trim() + "' and 返工單號='" + txt_BillNo.Text.Trim() + "' and 客戶代碼='" + ddlCustomer.EditValue + "'");
            if (BoxQty.Length > 0)
            {
                foreach (DataRow row in BoxQty)
                {
                    BQty = int.Parse(row[4].ToString());
                }
            }
            DataRow[] sumqty = sesstab.Select("外箱碼 = '" + txt_OuterBoxCode.Text.Trim() + "' and 返工單號='" + txt_BillNo.Text.Trim() + "' and 客戶代碼='" + ddlCustomer.EditValue + "'");
            int sumPro = 0;
            if (sumqty.Length > 0)
            {
                foreach (DataRow row in sumqty)
                {
                    sumPro += int.Parse(row[5].ToString());
                }
            }

            DataRow[] IsAdd = sesstab.Select("外箱碼 = '" + txt_OuterBoxCode.Text.Trim() + "' and 返工單號='" + txt_BillNo.Text.Trim() + "' and 產品碼 ='" + txt_ProductCode.Text.Trim() + "' and 客戶代碼='" + ddlCustomer.EditValue + "'");
            if (IsAdd.Length == 0 && sumPro < int.Parse(txt_Quantity.Text.Trim()) * BQty)
            {
                DataRow dr = sesstab.NewRow();

                dr["返工單號"] = txt_BillNo.Text.Trim();
                dr["客戶"] = ddlCustomer.Text.Trim();
                dr["外箱碼"] = txt_OuterBoxCode.Text.Trim();
                dr["產品碼"] = txt_ProductCode.Text.Trim();
                dr["箱數"] = BQty;
                dr["產品數"] = 1;
                dr["刪除"] = "刪除";
                dr["客戶代碼"] = ddlCustomer.EditValue;
                sesstab.Rows.InsertAt(dr, 0);
                gridControl1.DataSource = sesstab;
                GV.Columns[0].OptionsColumn.AllowEdit = false;
                GV.Columns[1].OptionsColumn.AllowEdit = false;
                GV.Columns[2].OptionsColumn.AllowEdit = false;
                GV.Columns[3].OptionsColumn.AllowEdit = false;
                GV.Columns[4].OptionsColumn.AllowEdit = false;
                GV.Columns[5].OptionsColumn.AllowEdit = false;
                GV.Columns[7].Visible = false;
                txt_ProductCode.Text = "";
            }
            else if (IsAdd.Length > 0 && sumPro < int.Parse(txt_Quantity.Text.Trim()) * BQty)
            {
                for (int i = 0; i < sesstab.Rows.Count; i++)
                {
                    if (sesstab.Rows[i]["外箱碼"].ToString().Trim() == txt_OuterBoxCode.Text.Trim() && sesstab.Rows[i]["產品碼"].ToString().Trim() == txt_ProductCode.Text.Trim())
                    {
                        sesstab.Rows[i]["產品數"] = int.Parse(sesstab.Rows[i]["產品數"].ToString()) + 1;
                        txt_ProductCode.Text = "";
                    }
                }
            }
            if (sumPro == int.Parse(txt_Quantity.Text.Trim()) * BQty - 1)
            {
                txt_OuterBoxCode.Text = "";
            }
            if (sumPro == int.Parse(txt_Quantity.Text.Trim()) * BQty)
            {
                BQty++;
                for (int i = 0; i < sesstab.Rows.Count; i++)
                {
                    if (sesstab.Rows[i]["外箱碼"].ToString().Trim() == txt_OuterBoxCode.Text.Trim() && sesstab.Rows[i]["客戶代碼"].ToString().Trim() == ddlCustomer.EditValue.ToString())
                    {
                        sesstab.Rows[i]["箱數"] = BQty;
                    }
                }
                IsAdd = sesstab.Select("外箱碼 = '" + txt_OuterBoxCode.Text.Trim() + "' and 返工單號='" + txt_BillNo.Text.Trim() + "' and 產品碼 ='" + txt_ProductCode.Text.Trim() + "' and 客戶代碼='" + ddlCustomer.EditValue + "'");
                if (IsAdd.Length == 0 && sumPro < int.Parse(txt_Quantity.Text.Trim()) * BQty)
                {
                    DataRow dr = sesstab.NewRow();
                    dr["返工單號"] = txt_BillNo.Text.Trim();
                    dr["客戶"] = ddlCustomer.Text.Trim();
                    dr["外箱碼"] = txt_OuterBoxCode.Text.Trim();
                    dr["產品碼"] = txt_ProductCode.Text.Trim();
                    dr["箱數"] = BQty;
                    dr["產品數"] = 1;
                    dr["刪除"] = "刪除";
                    dr["客戶代碼"] = ddlCustomer.EditValue;
                    sesstab.Rows.InsertAt(dr, 0);
                    gridControl1.DataSource = sesstab;
                    GV.Columns[0].OptionsColumn.AllowEdit = false;
                    GV.Columns[1].OptionsColumn.AllowEdit = false;
                    GV.Columns[2].OptionsColumn.AllowEdit = false;
                    GV.Columns[3].OptionsColumn.AllowEdit = false;
                    GV.Columns[4].OptionsColumn.AllowEdit = false;
                    GV.Columns[5].OptionsColumn.AllowEdit = false;
                    GV.Columns[7].Visible = false;
                    txt_ProductCode.Text = "";
                }
                else if (IsAdd.Length > 0 && sumPro < int.Parse(txt_Quantity.Text.Trim()) * BQty)
                {
                    for (int i = 0; i < sesstab.Rows.Count; i++)
                    {
                        if (sesstab.Rows[i]["外箱碼"].ToString().Trim() == txt_OuterBoxCode.Text.Trim() && sesstab.Rows[i]["產品碼"].ToString().Trim() == txt_ProductCode.Text.Trim())
                        {
                            sesstab.Rows[i]["產品數"] = int.Parse(sesstab.Rows[i]["產品數"].ToString()) + 1;
                            txt_ProductCode.Text = "";
                        }
                    }
                }
                if (sumPro == int.Parse(txt_Quantity.Text.Trim()) * BQty - 1)
                {
                    txt_OuterBoxCode.Text = "";
                }
            }
        }

加一段日期轉周的代碼:

                        string BCode = txt_OuterBoxCode.Text.Trim();
                        string date = BCode.Substring(BCode.Length - 10, 10);
                        DateTime datetime = Convert.ToDateTime(date);
                        int weekQty = datetime.DayOfYear / 7 + 1;
                        string weekName;
                        int day = 0;
                        weekName = datetime.DayOfWeek.ToString();
                        switch (weekName)
                        {
                            case "Sunday": day = 1; break;
                            case "Monday": day = 2; break;
                            case "Tuesday": day = 3; break;
                            case "Wednesday": day = 4; break;
                            case "Thursday": day = 5; break;
                            case "Friday": day = 6; break;
                            case "Saturday": day = 7; break;
                        }
                        string year = date.Substring(3, 1);
                        string BCheckDate = year.ToString() + weekQty.ToString() + day.ToString();
                        string PCode = txtBarScanner.Text.Trim();
                        string PCheckDate = PCode.Substring(13, 4);
                        if (BCheckDate == PCheckDate)
                        {
                            txt_ProductCode.Text = txtBarScanner.Text.Trim();
                            txtBarScanner.Text = "";
                        }
                        else if (BCheckDate != PCheckDate)
                        {
                            MessageBox.Show("產品碼:" + PCode + "與箱碼:" + BCode + "日期不符,請覈對後重新掃碼");
                            txtBarScanner.Text = "";
                            txtBarScanner.Focus();
                        }

3、查看界面:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章