我將一些紙質表單轉換爲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" />
您是否嘗試過使用可空的布爾類型(bool?)。這將給出三個選項,然後您可以檢查hasvalue是否將位列設置爲DBNull。 – 2012-03-06 21:33:50
@JonRaynor - 我嘗試了可空的bool類型,並從數據庫中讀取NULL值併發送給我的控件,如上所示,站點崩潰。 – 2012-03-07 16:28:36
當讀取數據時,您需要一些代碼來檢查數據庫中的值是否爲空,例如if(record [「YesNoFlag」] == DBNull.Value then //將可爲空的類型設置爲不具有值。 .. – 2012-03-07 18:58:58