2012-03-06 40 views
2

我將一些紙質表單轉換爲Web表單,我的一個要求是有一個Yes/No組的複選框,如果沒有選擇,也可以跟蹤。所以我不能只使用綁定到Sql Server中的一個位字段的CheckBox,因爲它不會跟蹤用戶是否忽略了該字段。自定義控件的綁定工作在GridView中但不在FormView中

爲了解決我的問題,我將兩個複選框包裝到一個ASCX控件中。然後我在ASCX控件中創建了一個公共Checked屬性。從這個屬性中,如果選中了真正的複選框,則返回「True」,如果複選框沒有被選中,則「False」爲false複選框,並且爲空字符串。

當我把這個控件放在一個GridView中,並使用GridView的SqlDataSource將它綁定到一個位域時,所有東西都完美地工作。當我在FormView中綁定相同的控件時,儘管FormView的更新將未觸摸的控件設置爲False。我跨過了我的控制邏輯,它正確地傳遞了空字符串,所以看起來FormView在將值發送到存儲過程之前會覆蓋該值。

有沒有辦法讓這個工作在FormView中,或者我將不得不重構使用類似int字段的東西來跟蹤三個選項:0 =沒有選擇,1 =真,2 =假或類似的東西?我已經提供了我的ASCX控件的代碼以供參考。

public partial class controls_yesNoCheck : System.Web.UI.UserControl 
{ 
    public string Checked 
    { 
     get 
     { 
      if (ckbNo.Checked) 
       return "false"; 
      if (ckbYes.Checked) 
       return "true"; 
      else 
       return ""; 
     } 
     set 
     { 
      if (value == "") 
      { 
       ckbNo.Checked = false; 
       ckbYes.Checked = false; 
      } 
      else if (value == "True" || value == "true") 
      { 
       ckbYes.Checked = true; 
       ckbNo.Checked = false; 
      } 
      else 
      { 
       ckbNo.Checked = true; 
       ckbYes.Checked = false; 
      } 
     } 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void noChecked(object sender, EventArgs e) 
    { 
     ckbYes.Checked = false; 
    } 

    protected void yesChecked(object sender, EventArgs e) 
    { 
     ckbNo.Checked = false; 
    } 
} 

編輯: 控制的前端看起來是這樣,我離開了CheckChanged方法了以前的代碼塊的,因爲它們的功能不會影響此問題。

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="yesNoCheck.ascx.cs" Inherits="controls_yesNoCheck" %> 

<asp:CheckBox ID="ckbYes" runat="server" Text="Yes" AutoPostBack="true" OnCheckedChanged="yesChecked" /> 
<asp:CheckBox ID="ckbNo" runat="server" Text="No" AutoPostBack="true" OnCheckedChanged="noChecked" /> 
+0

您是否嘗試過使用可空的布爾類型(bool?)。這將給出三個選項,然後您可以檢查hasvalue是否將位列設置爲DBNull。 – 2012-03-06 21:33:50

+0

@JonRaynor - 我嘗試了可空的bool類型,並從數據庫中讀取NULL值併發送給我的控件,如上所示,站點崩潰。 – 2012-03-07 16:28:36

+0

當讀取數據時,您需要一些代碼來檢查數據庫中的值是否爲空,例如if(record [「YesNoFlag」] == DBNull.Value then //將可爲空的類型設置爲不具有值。 .. – 2012-03-07 18:58:58

回答

0

對於任何可能偶然發現的人來說,@randomben和@jonraynot可能會吠叫「最佳實踐」樹,但我能夠通過更改存儲過程來解決我的問題。

它可能不是有史以來最偉大的解決方案,但在這裏。我改變了我的更新存儲過程的參數從一個位字段爲nvarchar(5),然後使用以下CASE語句(簡化,以傳達出點)

UPDATE table_name 
SET bit_column_name = CASE 
    WHEN @bit_column_name = 'True' THEN 'True' 
    WHEN @bit_column_name = 'False' THEN 'False' 
    ELSE NULL 
    END 

與該改變存儲過程我沒」我不得不對之前發佈的代碼做任何修改。

2

您是否想過使用nullable types

然後,你可以有更簡單的代碼,它會更好地匹配數據庫,因爲SQL Server有一個可空的位類型。像這樣的東西應該工作:基於關你說的錯誤沒有發生以上你的代碼,我敢打賭,有一些問題,你從字符串轉換爲int插入到數據庫所在的

public bool? Checked {get; private set;} 
public void setChecked(String value) 
{ 
    if (value == "") 
     _checked = null; 
    else if (value.ToLower() == "true") 
     _checked = true; 
    else 
     _checked = false; 
} 

。再次,切換到上面的代碼應該可以解決這個問題。

+0

+ 1閱讀我的想法 – 2012-03-06 21:34:23

+0

我沒有考慮過它b/c我不熟悉可爲空的類型。我的代碼出現編譯錯誤,但我會處理它並報告回來。謝謝 – 2012-03-06 21:39:46

+0

賈斯汀C - 嘗試我的修改後的代碼。我犯了兩個錯誤,因爲我輸入得太快。修改後的代碼應該更好。移動到setChecked的原因是您需要將字符串轉換爲布爾值,除非您還想讓get返回不理想的字符串,否則您無法在屬性上執行此操作。 – 2012-03-06 21:45:15

相關問題