当我们利用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
><
a
href
="FNCatalog.aspx"
title
="科目数据列表"
><
span
>
科目数据列表
</
span
></
a
></
li
>
<
li
><
a
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(0, new ListItem("--请选择--", ""));

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

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

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

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

this.txtDebit3.DataSource = subject.DataSetSubject(WebUtility.FNSubject.UseDirect.借方);
this.txtDebit3.DataTextField = "SubName";
this.txtDebit3.DataValueField = "SubCode";
this.txtDebit3.DataBind();
this.txtDebit3.Items.Insert(0, new 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项进行加载。
其实,这也不是高明之处,只是在工作中遇到的问题。认真细致的对待每一个问题,不要偷懒,相信已经能把工作做好。