該系統一共三個窗體:
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、查看界面: