2012-08-08 125 views
0

我已經發布了一個線程,避免向數據庫中添加空行。之前當點擊添加行時,無論用戶是否取消新行,它都會自動向數據庫中添加一個空行。我想通了,但現在出現了一個新問題。如果用戶在編輯新行時決定重新加載頁面(F5),它將在數據庫中添加一個空白行,這對我的情況來說是一個不行。任何人都可以幫我弄清楚如何避免這種情況?避免在數據庫中插入任何空白行

下面是我的插入代碼:

protected void gv_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 

     if (e.CommandName == "Insert") //- this is needed to explain that the INSERT command will only work when INSERT is clicked 
     { 
      gv.DataBind(); 

      DataTable d = dbcon.GetDataTable("SELECT * FROM CIS.CIS_TRANS ORDER BY ID DESC", "ProjectCISConnectionString"); 

      string transCode = "", fundCode = "", BSA_CD = "", DP_TYPE = ""; 

      if (d.Rows.Count > 0) 
      { 
       transCode = d.Rows[0]["TRANS_CD"].ToString(); 
       fundCode = d.Rows[0]["FUND_CD"].ToString(); 
       BSA_CD = d.Rows[0]["BSA_CD"].ToString(); 
       DP_TYPE = d.Rows[0]["DP_TYPE"].ToString(); 

       if (transCode.Trim().Length > 0) 
       { 
        dbcon.Execute("INSERT INTO CIS.CIS_TRANS (ID,TRANS_CD) VALUES(CIS.S_CIS_TRANS.nextval,'')", "ProjectCISConnectionString"); 

        gv.DataBind(); 
       } 
      } 

      gv.EditIndex = gv.Rows.Count - 1; 

     } 
     else if (e.CommandName == "Cancel") 
     { 
      DataTable d = dbcon.GetDataTable("SELECT * FROM CIS.CIS_TRANS ORDER BY ID DESC", "ProjectCISConnectionString"); 

      string transCode = ""; 

      if (d.Rows.Count > 0) 
      { 
       transCode = d.Rows[0]["TRANS_CD"].ToString(); 

       if (transCode.Trim().Length == 0) 
       { 
        dbcon.Execute(string.Format("DELETE CIS.CIS_TRANS WHERE ID = '{0}'", d.Rows[0]["ID"]), "ProjectCISConnectionString"); 

        gv.DataBind(); 
       } 
      } 


     } 
    } 
+0

當你說「當用戶試圖在編輯時重新加載頁面」是否意味着當用戶在編輯表單時點擊F5 ..? – MethodMan 2012-08-08 15:17:05

+0

是或當他們只選擇網址並點擊輸入。 – KKP 2012-08-08 15:20:25

+0

爲什麼你在開始時調用'gv.DataBind();'? – 2012-08-08 15:21:48

回答

2

如果你想避免用戶插入空行,你需要驗證。添加RequiredFieldValidator到插入模板:

<asp:RequiredFieldValidator runat="server" ID="valFieldName" 
< ControlToValidate="txtFieldName" ErrorMessage="FieldName is missing" /> 

在如果Page.IsValid == true你的方法檢查你插入到數據庫之前。

編輯: 如果你想避免回傳完全,你可以插入整個網格爲UpdatePanel

<asp:UpdatePanel> 
    <ContentTemplate> 
     <asp:GrdiView> 
     .... 
     </asp:GridView> 
    </ContentTemplate> 
</asp:UpdatePanel> 

現在,當用戶點擊F5他只是再一次,而不是重新加載頁面回發插入命令。

+0

好的,現在不適合這個鏡頭。 – KKP 2012-08-08 15:25:10

+0

在這種情況下驗證器是否有必要?因爲我已經在每個文本框上重新驗證過驗證器。我的情況是避免插入一個空白行,如果它的rreloaded(F5)(每隔一個停止空白行的方式被照顧)。 – KKP 2012-08-08 16:41:25

+0

F5是什麼意思?是用戶插入一行然後按F5? – 2012-08-08 19:10:27

0

看起來像你試圖把太多的邏輯放入代碼的一部分。您將數據庫邏輯放入按鈕命令中。想象一下,用戶只需掃描此按鈕。這會導致大量的空行。

嘗試這種方法:劃分數據庫邏輯和UI邏輯(例如MVVM)。今天這是一種常見模式。

想象一下,你創建的所有對象,現在用戶點擊「保存」按鈕(也可以通過改變連續發生 - 不管)。在執行保存命令後,你的視圖模型(視圖背後的邏輯)可以例如驗證您的數據。所以你可以更容易地擴展你的用戶界面的功能(如說:驗證或類似的東西)。

如果您想與您現有的代碼要做到這一點,每一個擴張會越來越炸燬它 - 直等到維護這個代碼是可怕的它並沒有花太多時間。

在你的虛擬機happend一切(驗證等)的交易指令到你的數據庫可能發生之後(類似myEntities.Save())。這個方法提供了你的業務對象被正確轉換成SQL並存儲在數據庫中。

這只是MVVM模式的一個非常簡短的解釋,但這似乎是我唯一適當的解決方案。