DropDownList控件运用

本文探讨了在ASP.NET中使用DropDownList控件时如何正确加载和更新数据源,特别是当数据源可能发生变更时如何避免错误。通过具体示例介绍了如何在编辑页面中处理已禁用项目的加载问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       当我们利用DropDownList控件,我们会需要根据上一级的编号,来灵活的指定下一级的编号,或者是初始化下一级的数据信息。在正常的情况下,我们的数据时正常的显示,如果我们对上一级的信息信息了因此,也就是说,作为下一级的数据源发上了变化,但是我们的信息已经是已经保存了,当我们还是这样的去加载信息,肯定为因为我们的数据集中不存在这一项,从而导致了运行页面的错误信息。
例如,下面的是我们需要调用父级的数据源信息,数据表结构如下所示:
-- =============================================================================
/****** 对象:表 dbo.FN_Subject ******/
/****** 说明:凭证管理-科目管理******/
-- =============================================================================
If   Exists  ( Select   *   From  sysobjects  where  id  =   object_id ( ' dbo.FN_Subject ' ))
Drop   table  dbo.FN_Subject
GO
Create   Table  dbo.FN_Subject (
    SubCode 
varchar ( 10 Not   Null ,         -- 科目代码
    SubName  varchar ( 50 Not   Null ,         -- 科目名称
    SubEName  varchar ( 50 Null ,         -- 科目英文名称
    SubType  varchar ( 10 Not   Null ,         -- 科目类型(往来借、往来货、应收帐款、营业费用、
                         -- 管理费用、财务费用、产品销售、进项税、销项税
                         -- 其它税、普通
    SubInter  varchar ( 10 Not   Null ,         -- 科目所属(资产类、负债类、权益类、损益类)
    UseDirec  varchar ( 10 Not   Null ,         -- 可用方向(借货方、仅借方、仅贷方)
    PreCode  varchar ( 10 Null ,             -- 上级代码;
    IfTop  bit   Not   Null ,             -- 最高级标识
    BalanceDirec  varchar ( 10 Not   Null ,     -- 余额方向(借方、货方)
    IfUsing  bit   Not   Null ,             -- 启用标识
    IfCapital  bit   Not   null ,             -- 资金实绩标识
     -- 显示在页面,但不用输入,通过默认值写入数据库
    RegDate  smalldatetime   Not   null          -- 登记日期
)
GO
Alter   table  dbo.FN_Subject  with   Nocheck   Add
    
Constraint  PK_FN_Subject  Primary   Key   Clustered
    (
        SubCode
    )
GO
ALTER   TABLE  dbo.FN_Subject  ADD  
    
CONSTRAINT  DF_FN_Subject_RegDate  DEFAULT  ( getdate ())  FOR  RegDate
GO
我们的下一级代码需要利用上面表中的SubCode,SubName作为DropDownList的数据集,条件是,判断IfUsing=0或者是等于1。当我们进行添加操作的时候,因为是添加操作,因此信息不会出错,以下代码是需要调用上级的SubCode的数据表的结构:
-- =============================================================================
/****** 对象:表 dbo.FN_Catalog ******/
/****** 说明:凭证管理-项目管理******/
-- =============================================================================
If   Exists  ( Select   *   From  sysobjects  where  id  =   object_id ( ' dbo.FN_Catalog ' ))
Drop   table  dbo.FN_Catalog
GO
Create   Table  dbo.FN_Catalog (
    FnCode 
varchar ( 10 Not   null ,         -- 凭证代码
    FnName  varchar ( 50 Not   Null ,         -- 凭证名称
    Debit1  varchar ( 10 Not   Null ,         -- 借方科目1
    Debit2  varchar ( 10 Null ,         -- 借方科目2
    Debit3  varchar ( 10 Null ,         -- 借方科目3
    Credit1  varchar ( 10 Not   Null ,         -- 货方科目1
    Credit2  varchar ( 10 Null ,         -- 货方科目2
    Credit3  varchar ( 10 Null ,         -- 货方科目3
)
GO
Alter   table  dbo.FN_Catalog  with   Nocheck   Add
    
Constraint  PK_FN_Catalog  Primary   Key   Clustered
    (
        FnCode
    )
GO

表结构中的Debit1,Debit2,Debit3,Credit1,Credit2,Credit3填充的值是FN_Subject 表中的SubCode值。
添加操作,一般不会出现什么问题,现在关键把编辑时,进行加载的进行说明,因为是关键,先将编辑页面的HTML代码帖出来(优快云添加图片比较的难,因此只能把HTMLCopy出来):

<% @ Page Language="C#" AutoEventWireup="true" CodeFile="Catalogedit.aspx.cs" StylesheetTheme="Default"
    Inherits
="Admin_Catalogedit" 
%>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head  runat ="server" >
    
< title > 凭证类型--编辑 </ title >
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
        
< fieldset >
            
< legend > 菜单 </ legend >
            
< div  id ="tabsF" >
                
< ul >
                    
< li >< href ="FNCatalog.aspx"  title ="科目数据列表" >< span > 科目数据列表 </ span ></ a ></ li >
                    
< li >< href ="Default.aspx"  title ="返回" >< span > 返回 </ span ></ a ></ li >
                
</ ul >
            
</ div >
        
</ fieldset >
        
< div >
            
< fieldset >
                
< legend > 科目管理详细信息 </ legend >
                
< table  cellpadding ="4"  style ="width: 100%" >
                    
< tr >
                        
< td  align ="left"  class ="tdbg" >
                            
< span  style ="color: #ff0000" > * </ span > 凭证编号: </ td >
                        
< td  align ="left" >
                            
< asp:TextBox  ID ="txtfnCode"  runat ="server"  ReadOnly ="True" ></ asp:TextBox >
                            
< asp:RequiredFieldValidator  ID ="RequiredFieldValidator1"  runat ="server"  ControlToValidate ="txtfnCode"
                                ErrorMessage
="凭证编号不能为空" > * </ asp:RequiredFieldValidator ></ td >
                        
< td  align ="left"  class ="tdbg" >
                            
< span  style ="color: #ff0000" > * </ span > 凭证名称: </ td >
                        
< td  align ="left" >
                            
< asp:TextBox  ID ="txtfnName"  runat ="server" ></ asp:TextBox >
                            
< asp:RequiredFieldValidator  ID ="RequiredFieldValidator2"  runat ="server"  ControlToValidate ="txtfnName"
                                ErrorMessage
="凭证名称不能为空" > * </ asp:RequiredFieldValidator ></ td >
                    
</ tr >
                    
< tr >
                
< td  align ="left"  class ="tdbg" >
                    
< span  style ="color: #ff0000" > * </ span > 借方科目1: </ td >
                
< td  align ="left" >
                    
< asp:DropDownList  ID ="txtDebit1"  runat ="server" />< asp:RequiredFieldValidator  ID ="RequiredFieldValidator3"  runat ="server"  ControlToValidate ="txtDebit1"
                        ErrorMessage
="借方科目1不能为空" > * </ asp:RequiredFieldValidator ></ td >
                
< td  align ="left"  class ="tdbg" >
                    
< span  style ="color: #ff0000" > * </ span > 货方科目1: </ td >
                
< td  align ="left" >
                    
< asp:DropDownList  ID ="txtCredit1"  runat ="server" />< asp:RequiredFieldValidator  ID ="RequiredFieldValidator4"  runat ="server"  ControlToValidate ="txtCredit1"
                        ErrorMessage
="贷方科目1不能为空" > * </ asp:RequiredFieldValidator ></ td >
            
</ tr >
            
< tr >
                
< td  align ="left"  class ="tdbg" >
                    借方科目2:
</ td >
                
< td  align ="left" >
                    
< asp:DropDownList  ID ="txtDebit2"  runat ="server" /></ td >
                
< td  align ="left"  class ="tdbg" >
                    货方科目2:
                
</ td >
                
< td  align ="left" >
                    
< asp:DropDownList  ID ="txtCredit2"  runat ="server" /></ td >
            
</ tr >
            
< tr >
                
< td  align ="left"  class ="tdbg" >
                    
< span  style ="color: #000000; background-color: #edf2fc;" >
                    借方科目3:
</ span ></ td >
                
< td  align ="left" >
                    
< asp:DropDownList  ID ="txtDebit3"  runat ="server" /></ td >
                
< td  align ="left"  class ="tdbg" >
                    货方科目3:
</ td >
                
< td  align ="left" >
                    
< asp:DropDownList  ID ="txtCredit3"  runat ="server" /></ td >
            
</ tr >
                    
< tr >
                        
< td  align ="center"  colspan ="4" >
                            
< asp:Button  ID ="btnAdd"  runat ="server"  Text ="更新"  OnClick ="btnAdd_Click"   /></ td >
                    
</ tr >
                
</ table >
            
</ fieldset >
        
</ div >
        
< fieldset  style ="text-align: left" >
            
< legend > 业务逻辑 </ legend >
            
< ul >
                
< li > < span  style ="color: red" > * </ span > 项不能为空 </ li >
            
</ ul >
        
</ fieldset >
        
< asp:ValidationSummary  ID ="ValidationSummary1"  runat ="server"  ShowMessageBox ="True"
            ShowSummary
="False"   />
    
</ form >
</ body >
</ html >
以下是页面对应的后台编码:
using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

public   partial   class  Admin_Catalogedit : System.Web.UI.Page
{
    WebUtility.FNCataLog cata;
    WebUtility.FNSubject subject;
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
if (!Page.IsPostBack)
        
{
            
string fncode = Request.QueryString["fncode"].ToString();
            cata 
= new WebUtility.FNCataLog(fncode);
            subject 
= new WebUtility.FNSubject();

            
this.txtfnCode.Text = cata.FNCode;
            
this.txtfnName.Text = cata.FNName;

            
this.txtCredit1.DataSource = subject.DataSetSubject(WebUtility.FNSubject.UseDirect.贷方);
            
this.txtCredit1.DataTextField = "SubName";
            
this.txtCredit1.DataValueField = "SubCode";
            
this.txtCredit1.DataBind();
            
this.txtCredit1.Items.Insert(0new ListItem("--请选择--"""));

            
this.txtCredit2.DataSource = subject.DataSetSubject(WebUtility.FNSubject.UseDirect.贷方);
            
this.txtCredit2.DataTextField = "SubName";
            
this.txtCredit2.DataValueField = "SubCode";
            
this.txtCredit2.DataBind();
            
this.txtCredit2.Items.Insert(0new ListItem("--请选择--"""));

            
this.txtCredit3.DataSource = subject.DataSetSubject(WebUtility.FNSubject.UseDirect.贷方);
            
this.txtCredit3.DataTextField = "SubName";
            
this.txtCredit3.DataValueField = "SubCode";
            
this.txtCredit3.DataBind();
            
this.txtCredit3.Items.Insert(0new ListItem("--请选择--"""));

            
this.txtDebit1.DataSource = subject.DataSetSubject(WebUtility.FNSubject.UseDirect.借方);
            
this.txtDebit1.DataTextField = "SubName";
            
this.txtDebit1.DataValueField = "SubCode";
            
this.txtDebit1.DataBind();
            
this.txtDebit1.Items.Insert(0new ListItem("--请选择"""));

            
this.txtDebit2.DataSource = subject.DataSetSubject(WebUtility.FNSubject.UseDirect.借方);
            
this.txtDebit2.DataTextField = "SubName";
            
this.txtDebit2.DataValueField = "SubCode";
            
this.txtDebit2.DataBind();
            
this.txtDebit2.Items.Insert(0new ListItem("--请选择"""));

            
this.txtDebit3.DataSource = subject.DataSetSubject(WebUtility.FNSubject.UseDirect.借方);
            
this.txtDebit3.DataTextField = "SubName";
            
this.txtDebit3.DataValueField = "SubCode";
            
this.txtDebit3.DataBind();
            
this.txtDebit3.Items.Insert(0new ListItem("--请选择"""));


            
//this.txtCredit1.Items.FindByValue(cata.Credit1).Selected = true;

            
//判断是否存在值,不存在,将设置为请选择状态
            
//原因可能是以前使用的一项已经被禁止了

            
this.BeginExecuteCircle(this.txtCredit1,cata.Credit1);
            
this.BeginExecuteCircle(this.txtCredit2,cata.Credit2);
            
this.BeginExecuteCircle(this.txtCredit3,cata.Credit3);
            
this.BeginExecuteCircle(this.txtDebit1,cata.Debit1);
            
this.BeginExecuteCircle(this.txtDebit2,cata.Debit2);
            
this.BeginExecuteCircle(this.txtDebit3,cata.Debit3);
        }

        
    }


    
private void BeginExecuteCircle(DropDownList ddlList,string validateValue)
    
{
        
int count = 0;
        ListItem GetItem
=new ListItem();
        
foreach (ListItem item in ddlList.Items)
        
{
            
if (validateValue == item.Value)
            
{
                count 
= 1;
                GetItem 
= item;
            }

        }

        
if (count > 0)
        
{
            
this.SetDropDownListStat(true, ddlList, GetItem);
        }

        
else
        
{
            
this.SetDropDownListStat(false, ddlList, GetItem);
        }

        
    }


    
private void SetDropDownListStat(bool IsValdate, DropDownList ddl, ListItem NO)
    
{
        
if (IsValdate)
        
{
            ddl.Items.FindByValue(NO.Value).Selected 
= true;
        }

        
else
        
{
            ddl.Items[
0].Selected = true;
        }

    }


    
protected void btnAdd_Click(object sender, EventArgs e)
    
{
        cata 
= new WebUtility.FNCataLog();
        cata.Credit1 
= this.txtCredit1.SelectedValue;
        cata.Credit2 
= this.txtCredit2.SelectedValue;
        cata.Credit3 
= this.txtCredit3.SelectedValue;
        cata.Debit1 
= this.txtDebit1.SelectedValue;
        cata.Debit2 
= this.txtDebit2.SelectedValue;
        cata.Debit3 
= this.txtDebit3.SelectedValue;
        cata.FNCode 
= this.txtfnCode.Text;
        cata.FNName 
= this.txtfnName.Text;

        
int i = cata.Update();
        WebUtility.Define.MessageBox(
this.Page, i);
    }

}

       上面的加重斜体红色的字,是我以前用的方法,怎么说呢,比较省事,可是在上级的查询条件IFUsing=1 如果是这条数据已经存在了,现在查询不能把这个这一项加载上去,但是从数据库读出来的却有这项值,因此加载页面就会出错。那句话我已经注释掉了,改用下面的方法,通过传递参数进行循环判断,如果加载的数据源中存在从数据库中读出来的值,将该值加载上去,如果不存在将默认的第0项进行加载。
      其实,这也不是高明之处,只是在工作中遇到的问题。认真细致的对待每一个问题,不要偷懒,相信已经能把工作做好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值