ASP.NET CheckBoxField绑定到没有布尔值的oracle。已知的工作?

时间:2011-09-07 17:49:45

标签: .net asp.net oracle

我有一个gridview控制器,其中有一组BoundField列到我的数据源。我还有一个CheckBoxField我想要检查,具体取决于我从数据库中获取的表中的行是否相应标记。问题是,Oracle没有布尔类型,ASP.NET期望一个布尔值来标记复选框。对此有什么解决方法吗?

这是我的gridview,带有复选框列。

<asp:GridView ID="DeviceGridView" runat="server" CssClass="SmallGridView"  
       DataSourceID="DeviceDataSource" AutoGenerateColumns="False" 
       EmptyDataText="No devices found." CellPadding="4" ForeColor="#333333" 
       GridLines="None"  OnRowCreated="GridView_RowCreated" 
       OnRowDataBound="GridView_RowDataBound"  >
    <FooterStyle CssClass="gridViewFooter" />
    <RowStyle CssClass="gridViewRow" />
    <EditRowStyle CssClass="gridViewEditRow" />
    <SelectedRowStyle CssClass="gridViewSelectedRow" />
    <HeaderStyle CssClass="gridViewHeader" />
    <AlternatingRowStyle CssClass="gridViewAltRow" />
    <Columns>
        <asp:BoundField HeaderText="DeviceID" DataField="device_id" />
        <asp:BoundField HeaderText="Device Type" DataField="device_type" />
        <asp:BoundField HeaderText="Description" DataField="description" />
        <asp:BoundField HeaderText="Enable Logging" DataField="enable_logging" />
        <asp:CheckBoxField DataField="normal_toggle" Text="Normal User Logging" />
    </Columns>
 </asp:GridView>

4 个答案:

答案 0 :(得分:1)

请尝试使用模板字段,而不是使用<asp:CheckBoxField>

<asp:TemplateField>
    <ItemTemplate>
        <asp:CheckBox ID="cb" runat="server" 
                      Checked='<%# Eval("normal_toggle") == 1 %>' 
                      AutoPostBack="true" 
                      OnCheckedChanged="YourCheckedChangedEvent"/>
    </ItemTemplate>
</asp:TemplateField>

如果normal_toggle值等于1,则会检查您的复选框,否则将取消选中。相应地调整您的数据。

<强>更新

在模板字段内的<asp:Checkbox>添加了一个事件。

答案 1 :(得分:1)

<asp:TemplateField> <ItemTemplate> <asp:CheckBox ID="cb" runat="server" Checked='<%# Eval("normal_toggle").ToString() == "Y" ? true : false %>' /> </ItemTemplate> </asp:TemplateField>

答案 2 :(得分:0)

这是我对此问题的解决方案 首先,我创建了自己的CheckBox组件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.Text;

namespace Production_Manager.Util.Objects
{
    public class CheckBoxYN : System.Web.UI.WebControls.CheckBox
    {
        public string YesNo
        {
            get
            {
                if (this.Checked)
                    return "Y";
                else
                    return "N";
            }
            set
            {
                bool changed = false;
                if (value == "Y")
                {
                    if (!this.Checked)
                        changed = true;

                    this.Checked = true;

                    if (changed)
                        OnPropertyChanged("YesNo");
                }
                else
                {
                    if (this.Checked)
                        changed = true;

                    this.Checked = false;

                    if (changed)
                        OnPropertyChanged("YesNo");

                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }

        }

        protected override void OnCheckedChanged(EventArgs e)
        {
            OnPropertyChanged("YesNo");
            base.OnCheckedChanged(e);
        }    
}
}

编译项目后,CheckBoxYN将出现在工具箱中。 在项目和编辑模板中放置您的对象 YOURBOOLFIELD:             '/&gt;

希望这有帮助。

答案 3 :(得分:0)

我知道这已经很老了,但我只花了几个小时试图为MYSQL排序,可能适用于ORACLE。

在您的UPDATE或INSERT语句中,您可以使用此

column_name = IF(?=&#39; True&#39;,1,0)

VALUES(如果(?=&#39; True&#39;,1,0),...)

无需将绑定的复选框字段更改为项目模板或任何内容。

我不确定这是否重要,但我将参数类型更改为布尔值,因为我现在让它工作,我不想改变它。