绑定数据库数据,这类数据绑定方法只能在数据绑定控件的上下文中使用10bet手机官网
分类:web前端

绑定 DropDownList、CheckBoxList 代码很类似。

FormView控件是可及显示、修改、添加、删除为一体的控件,感觉很好用,可是昨天发现了一个可以说是它的一个Bug吧,我是想要实现下拉框的联动效果,比如在A下拉框选择了省对应B的下拉框会把对应A中省的市显示在B下拉框中,我想要实现的是校区和对应校区建筑的联动效果,单纯的这种效果很好实现比如下面的代码

HTML:

ASP.NET 中,给 ListBox 绑定数据库数据,要比其它绑定多两个步骤。需要指定两个值:option 的 text 和 value 分别对应哪个字段。

DropDownList

10bet手机官网 1        <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SqlDataSource2"
10bet手机官网 2            DataTextField="校区简称" DataValueField="校区代码" AutoPostBack="true">
10bet手机官网 3        </asp:DropDownList>
10bet手机官网 4        <asp:DropDownList ID="DropDownList3" runat="server" DataSourceID="SqlDataSource3"
10bet手机官网 5            DataTextField="楼名称" DataValueField="楼代码">
10bet手机官网 6        </asp:DropDownList><asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:SBGLConnectionString %>"
10bet手机官网 7            SelectCommand="SELECT [楼名称], [楼代码] FROM [C_楼名代码表] WHERE ([校区] = @校区)">
10bet手机官网 8            <SelectParameters>
10bet手机官网 9                <asp:ControlParameter ControlID="DropDownList2" Name="校区" PropertyName="SelectedValue"
10bet手机官网 10                    Type="Int32" />
10bet手机官网 11            </SelectParameters>
10bet手机官网 12        </asp:SqlDataSource>
10bet手机官网 13        <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:SBGLConnectionString %>"
10bet手机官网 14            SelectCommand="SELECT [校区代码], [校区简称] FROM [C_校区代码表]"></asp:SqlDataSource>
10bet手机官网 15

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GridView.aspx.cs" Inherits="RGY_WebApp.GridView" %>

list.DataSource = ds.Tables[0].DefaultView; //ds 为 DataSet 对象
list.DataTextField = "textFld"; //textFld 为字段名称
list.DataValueField = "valueFld"; //valueFld 为字段名称
list.DataBind();

<asp:DropDownList ID="_companyId" runat="server" DataSourceID="_companiesDataSource" DataTextField="CompanyName" DataValueField="CompanyId" SelectedValue='<%# Bind("CompanyId") %>'></asp:DropDownList>

只需要这样就可以了,不用再CS中编写代码
但是把这个代码转移到FormView中就会出错,一般页面第一次载入时时不会出错的,我也不知道为什么,但是如果将校区换了以后就会出现下面的错误

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ";

同样实用于 DropDownList。

CheckBoxList

Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用。

<html xmlns=";
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
       <asp:GridView ID="GridView11"  runat="server" AllowPaging="true" AutoGenerateColumns="False" 
                DataKeyNames="Id,Type" 
            OnRowCancelingEdit="grdContact_RowCancelingEdit"  DataSourceID="ObjectDataSource1"
                OnRowDataBound="grdContact_RowDataBound" OnRowEditing="grdContact_RowEditing" 
                OnRowUpdating="grdContact_RowUpdating" OnRowCommand="grdContact_RowCommand" 
                ShowFooter="True" OnRowDeleting="grdContact_RowDeleting" BackColor="White" 
                BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px" 
            CellPadding="4" PageSize="5" 
                EnableModelValidation="True" onrowcreated="GridView11_RowCreated" >

也可以利用声明式数据绑定:

<asp:CheckBoxList ID="_categoryId" runat="server" DataSourceID="_categoriesDataSource" DataTextField="CategoryName" DataValueField="CategoryId" SelectedValue='<%# Bind("CategoryId") %>' RepeatDirection="Horizontal" RepeatColumns="4"></asp:CheckBoxList>

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用。 源错误:

[没有相关的源行]

            <FooterStyle BackColor="#FFFFCC" ForeColor="#330099" />
            <RowStyle BackColor="White" ForeColor="#330099" />
            <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="#663399" />
            <PagerStyle BackColor="#FFFFCC" ForeColor="#330099" HorizontalAlign="Center" />
            <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="#FFFFCC" />
            <Columns>
              <asp:TemplateField HeaderText="ID"  HeaderStyle-HorizontalAlign="Left"> 
                <EditItemTemplate> 
                    <asp:Label ID="id" runat="server" Text='<%# Bind("Id") %>'></asp:Label>
                </EditItemTemplate> 
                <ItemTemplate> 
                    <asp:Label ID="lblId" runat="server" Text='<%# Bind("Id") %>'></asp:Label> 
                </ItemTemplate> 
                <HeaderStyle HorizontalAlign="Left"></HeaderStyle>
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Name" HeaderStyle-HorizontalAlign="Left"> 
                <EditItemTemplate> 
                    <asp:TextBox ID="name" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox> 
                </EditItemTemplate> 
                <FooterTemplate> 
                    <asp:TextBox ID="txtNewName" Text="name" runat="server" ></asp:TextBox> 
                </FooterTemplate> 
                <ItemTemplate> 
                    <asp:Label ID="lblName" runat="server" Text='<%# Bind("Name") %>'></asp:Label> 
                </ItemTemplate> 

<asp:DropDownList ID="_categoryId" runat="server"
                    DataSourceID="SqlDataSource2" DataTextField="categoryName" DataValueField="categoryId" SelectedValue="<%# Bind('categoryId') %>">

说明

而且我还不知道是哪行错了,上网查了查,也有好多人问,但是没有人能给人正确或者说比较好的答案,我找了半天也没有找到解决办法,看来只能自己试一试了,差不多用了半天时间吧我已经能够实现想要实现的效果了,下面是我的代码,还请大家指点,哪如果有不足的地方请多指点 在ASPX文件中进行添加一个GridView然后对插入模板进行编辑实现校区下拉菜单和楼名的连动效果,这里需要注意以下几点: 1要实现连动要把校区下拉框的AutoPostBack属性设置为true; 2校区下拉框所对应的数据源孔件必须放在FormView里,否则回报错,找不到数据源 3对应校区的楼的下拉框的数据源空间要放到FormView的外面,实际上数据源和楼名下拉框基本上没有什么关系了,只是通过数据源获取数据然后把数据传递给DropDownList

10bet手机官网 16        <asp:FormView ID="fv_ShiYanShi" runat="server" DefaultMode="Insert" Width="437px">
10bet手机官网 17            <InsertItemTemplate>
10bet手机官网 18                <asp:DropDownList ID="dpl_xiaoqu" runat="server" AutoPostBack="True" DataSourceID="sqd_xiaoqu"
10bet手机官网 19                    DataTextField="校区简称" DataValueField="校区代码" SelectedValue='<%# Bind("校区") %>'
10bet手机官网 20                    Width="200px">
10bet手机官网 21                </asp:DropDownList><asp:SqlDataSource ID="sqd_xiaoqu" runat="server" ConnectionString="<%$ ConnectionStrings:SBGLConnectionString %>"
10bet手机官网 22                    SelectCommand="SELECT [校区代码], [校区简称] FROM [C_校区代码表]"></asp:SqlDataSource>
10bet手机官网 23                <asp:DropDownList ID="dpl_lou" runat="server" SelectedValue='<%# Bind("所在楼名") %>' Width="200px">
10bet手机官网 24                </asp:DropDownList>
10bet手机官网 25            </InsertItemTemplate>
10bet手机官网 26        </asp:FormView>
10bet手机官网 27        <asp:SqlDataSource ID="sqd_lou" runat="server" ConnectionString="<%$ ConnectionStrings:SBGLConnectionString %>"
10bet手机官网 28            SelectCommand="SELECT [楼代码], [楼名称], [校区] FROM [C_楼名代码表] WHERE ([校区] = @校区)" DataSourceMode="DataSet">
10bet手机官网 29            <SelectParameters>
10bet手机官网 30                <asp:Parameter Name="校区" Type="Int32" />
10bet手机官网 31            </SelectParameters>
10bet手机官网 32        </asp:SqlDataSource>
10bet手机官网 33        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:SBGLConnectionString %>"
10bet手机官网 34            SelectCommand="SELECT [楼代码], [楼名称] FROM [C_楼名代码表] WHERE ([校区] = @校区)" DataSourceMode="DataSet">
10bet手机官网 35            <SelectParameters>
10bet手机官网 36                <asp:Parameter Name="校区" Type="Int32" />
10bet手机官网 37            </SelectParameters>
10bet手机官网 38        </asp:SqlDataSource>
10bet手机官网 39        <asp:DropDownList ID="DropDownList1" runat="server">
10bet手机官网 40        </asp:DropDownList>
10bet手机官网 41

<HeaderStyle HorizontalAlign="Left"></HeaderStyle>
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Sex" HeaderStyle-HorizontalAlign="Left"> 
               <EditItemTemplate> 
                    <asp:DropDownList ID="sex" runat="server"> 
                        <asp:ListItem Value="男" Text="Male"></asp:ListItem>
                        <asp:ListItem Value="女" Text="Female"></asp:ListItem>
                    </asp:DropDownList> 
                </EditItemTemplate> 
                <ItemTemplate> 
                    <asp:Label ID="lblSex" runat="server" Text='<%# Eval("Sex") %>'></asp:Label> 
                </ItemTemplate> 
                <FooterTemplate> 
                    <asp:DropDownList ID="ddlNewSex" runat="server" >
                        <asp:ListItem Text="男" Value="Male" Selected="True"></asp:ListItem> 
                        <asp:ListItem Text="女" Value="Female"></asp:ListItem> </asp:DropDownList> 
                </FooterTemplate> 

详情请参见:

DataTextField 是文字字段名称,DataValueField 是值字段名称,SelectedValue 是选中值,输入 SelectedValue 时不会给予智能提示,但没关系,直接写,不会报错。

在对应的CS文件中这样进行处理

10bet手机官网 42    private DropDownList dpl_xiaoqu;
10bet手机官网 43    private DropDownList dpl_lou;
10bet手机官网 44
10bet手机官网 45    protected void Page_Load(object sender, EventArgs e)
10bet手机官网 4610bet手机官网 47    10bet手机官网 48{
10bet手机官网 49        dpl_xiaoqu = (DropDownList)this.fv_ShiYanShi.FindControl("dpl_xiaoqu");
10bet手机官网 50        dpl_lou = (DropDownList)this.fv_ShiYanShi.FindControl("dpl_lou");
10bet手机官网 51        dpl_xiaoqu_SelectedIndexChanged();
10bet手机官网 52    }
10bet手机官网 53    protected void dpl_xiaoqu_SelectedIndexChanged()
10bet手机官网 5410bet手机官网 55    10bet手机官网 56{
10bet手机官网 57        dpl_lou.Items.Clear();
10bet手机官网 58
10bet手机官网 59        this.sqd_lou.SelectParameters["校区"].DefaultValue = this.dpl_xiaoqu.SelectedValue;
10bet手机官网 60
10bet手机官网 61        DataView datav = (DataView)this.sqd_lou.Select(DataSourceSelectArguments.Empty);
10bet手机官网 62        foreach (DataRowView dr in datav)
10bet手机官网 6310bet手机官网 64        10bet手机官网 65{
10bet手机官网 66            ListItem li = new ListItem();
10bet手机官网 67            li.Value = dr.Row["楼代码"].ToString();
10bet手机官网 68            li.Text = dr.Row["楼名称"].ToString();
10bet手机官网 69            dpl_lou.Items.Add(li);
10bet手机官网 70        }
10bet手机官网 71    }
10bet手机官网 72

<HeaderStyle HorizontalAlign="Left"></HeaderStyle>
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Type" HeaderStyle-HorizontalAlign="Left"> 
                <EditItemTemplate> 
                    <asp:DropDownList ID="type" runat="server" DataSourceID="ObjectDataSource2" DataTextField="TypeName" DataValueField="Id"> </asp:DropDownList> 
                </EditItemTemplate> 
                <ItemTemplate> 
                    <asp:Label ID="lblType" runat="server" Text='<%# Eval("Type") %>'></asp:Label> 
                </ItemTemplate> 
                <FooterTemplate> 
                    <asp:DropDownList ID="cmbNewType" runat="server" DataSourceID="ObjectDataSource2" DataTextField="TypeName" DataValueField="Id"> </asp:DropDownList> 
                </FooterTemplate> 

CheckBoxList 是多选呀!

<HeaderStyle HorizontalAlign="Left"></HeaderStyle>
            </asp:TemplateField> 

相关阅读

其实上面对 CheckBoxList 的应用不对,为什么呢?因为 CheckBoxList 是多选,而使用 SelectedValue 只能设置或读取第一个选择项。

            <asp:TemplateField HeaderText="Ative"> 
                <EditItemTemplate> 
                    <asp:CheckBox ID="isActive"  runat="server" />
                </EditItemTemplate> 
                <ItemTemplate> 
                    <asp:Label ID="lblActive" runat="server" Text='<%# Eval("IsActive") %>'></asp:Label> 
                </ItemTemplate> 
                <FooterTemplate> 
                    <asp:CheckBox ID="chkNewActive" runat="server" />
                </FooterTemplate> 
            </asp:TemplateField> 
                <asp:TemplateField HeaderText="Edit" ShowHeader="False" HeaderStyle-HorizontalAlign="Left"> 
                <EditItemTemplate> 
                    <asp:LinkButton ID="lnkEdit" runat="server" CausesValidation="True" CommandName="Update" Text="Update"></asp:LinkButton> 
                    <asp:LinkButton ID="lnkCancel" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"></asp:LinkButton> 
                </EditItemTemplate> 
                <FooterTemplate> 
                    <asp:LinkButton ID="lnkAdd" runat="server" CausesValidation="False" CommandName="Insert" Text="Insert"></asp:LinkButton> 
                </FooterTemplate> 
                <ItemTemplate> 
                    <asp:LinkButton ID="lnkEdit" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"></asp:LinkButton> 
                    <asp:LinkButton ID="LnkDelete" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete"></asp:LinkButton> 
                </ItemTemplate>  
<HeaderStyle HorizontalAlign="Left"></HeaderStyle>
            </asp:TemplateField> 
            
             
            </Columns>
        </asp:GridView>

  • DataSet 应用示例

应该是循环 CheckBoxList 的每一个 Item,然后对 Selected 进行判断或操作。

    </div>
    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="getAll" 
        TypeName="UserManager.DAL.ContactOperator" 
        UpdateMethod="UpdateContactInfo" DeleteMethod="deleteContactInfo">
         
         
    </asp:ObjectDataSource>
    <asp:ObjectDataSource ID="ObjectDataSource2" runat="server" 
        SelectMethod="getAllContactType"  TypeName="UserManager.DAL.ContactOperator">
    </asp:ObjectDataSource>
    </form>
</body>
</html>

微软原话:若要确定 CheckBoxList 控件中的选定项,请循环访问 Items 集合并测试该集合中每一项的 Selected 属性。

 

相关阅读

Code: 

  • 声明式数据绑定教程-ObjectDataSource
  • 判断 ObjectDataSource 执行情况
  • eval 与 bind 区别
  • 在 DetailsView 和 GridView 中 FindControl 的不同点

 using System;

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace RGY_WebApp
{
    public partial class GridView : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void grdContact_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {

        }

        protected void grdContact_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName.Equals("Insert"))
            {
                TextBox txtNewName = (TextBox)GridView11.FooterRow.FindControl("txtNewName");
                CheckBox chkNewActive = (CheckBox)GridView11.FooterRow.FindControl("chkNewActive");
                DropDownList cmbNewType = (DropDownList)GridView11.FooterRow.FindControl("cmbNewType");
                DropDownList ddlNewSex = (DropDownList)GridView11.FooterRow.FindControl("ddlNewSex");

                ObjectDataSource1.InsertParameters.Add("name", txtNewName.Text);
                ObjectDataSource1.InsertParameters.Add("sex", ddlNewSex.SelectedValue);
                ObjectDataSource1.InsertParameters.Add("type", cmbNewType.SelectedValue);
                ObjectDataSource1.InsertParameters.Add("isActive", System.Data.DbType.Boolean,chkNewActive.Checked?"true":"false");
              
                ObjectDataSource1.Insert();
            }
            if (e.CommandName.Equals("Delete"))
            {
                int index = int.Parse(e.CommandArgument.ToString());
                GridViewRow row = GridView11.Rows[index];
                Label id = (Label)row.FindControl("lblId");

                ObjectDataSource1.DeleteParameters.Add("id",id.Text);

                ObjectDataSource1.Delete();
            }
            if (e.CommandName.Equals("Update"))
            {

                int index = int.Parse(e.CommandArgument.ToString());
                GridViewRow row = GridView11.Rows[index];

                TextBox txtNewName = (TextBox)row.FindControl("name");
                Label id = (Label)row.FindControl("id");
                CheckBox chkNewActive = (CheckBox)row.FindControl("isActive");
                DropDownList cmbNewType = (DropDownList)row.FindControl("type");
                DropDownList ddlNewSex = (DropDownList)row.FindControl("sex");

                ObjectDataSource1.UpdateParameters.Add("id", id.Text);
                ObjectDataSource1.UpdateParameters.Add("name", txtNewName.Text);
                ObjectDataSource1.UpdateParameters.Add("sex", ddlNewSex.SelectedValue);
                ObjectDataSource1.UpdateParameters.Add("type", cmbNewType.SelectedValue);
                ObjectDataSource1.UpdateParameters.Add("isActive", System.Data.DbType.Boolean, "false");

            }   
        }

        protected void grdContact_RowDataBound(object sender, GridViewRowEventArgs e)
        {

        }

        protected void grdContact_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {

        }

        protected void grdContact_RowEditing(object sender, GridViewEditEventArgs e)
        {

        }

        protected void grdContact_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {

            ObjectDataSource1.Update();
        }

        protected void GridView11_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                LinkButton LinkButton1 = (LinkButton)e.Row.FindControl("lnkEdit");
                // Set the LinkButton's CommandArgument property with the row's index.
                LinkButton1.CommandArgument = e.Row.RowIndex.ToString();

                LinkButton LinkButton2 = (LinkButton)e.Row.FindControl("LnkDelete");
                // Set the LinkButton's CommandArgument property with the row's index.
                if (LinkButton2!=null)
                    LinkButton2.CommandArgument = e.Row.RowIndex.ToString();
            }
        }
    }
}

本文由10bet手机官网发布于web前端,转载请注明出处:绑定数据库数据,这类数据绑定方法只能在数据绑定控件的上下文中使用10bet手机官网

上一篇:对分页说法的不同,手动指定 下一篇:net后台代码动态添加JS文件和css文件的引用,动态加载css与js总结
猜你喜欢
热门排行
精彩图文