7.5 编辑业务数据表字段
通过上一节创建业务数据表关联,业务表名称、创建者等信息被记录到关联表RelatedTables中,同时业务表字段名、字段类型、字段长度等信息被记录到业务字段数据表RelatedTableFields中。编辑业务数据表字段的程序是对业务字段的进一步设置,包括字段中文名、字段的编辑控件类型等,以备执行业务过程时显示和编辑业务数据使用。编辑业务数据表字段的页面如图7.6所示:

图7.6 编辑业务表字段
7.5.1 RelatedTableFields.aspx页面文件代码
页面设计如图7.7所示:

图7.7 编辑业务字段页面设计
页面代码如下:
......
<form id="Form1" method="post" runat="server">
<table height="60" cellSpacing="0" cellPadding="0" width="100%" border="0">
<tr><td></td></tr>
</table>
<table cellSpacing="0" cellPadding="0" width="100%" align="center" border="0">
<tr>
<td style="FONT-SIZE: 16px" align="center">编辑业务数据表字段</td>
</tr>
<tr height="50">
<td align="right"><span id="Message" style="FONT-SIZE: 11pt; FONT-FAMILY: Arial"
runat="server" MaintainState="false"></span>
<asp:dropdownlist id="DropDownList1" runat="server" >
</asp:dropdownlist>
</td>
</tr>
<tr>
<td><asp:datagrid id="DataGrid1" runat="server" AllowPaging="True" Width="100%"
DataKeyField="FieldName" HeaderStyle-HorizontalAlign="Center"
>
<ItemStyle Font-Size="13px" HorizontalAlign="Center" Height="28px"
VerticalAlign="Bottom"></ItemStyle>
<HeaderStyle Font-Size="16px" HorizontalAlign="Center" Height="30px"
VerticalAlign="Middle" BackColor="#EEEEEE"></HeaderStyle>
<Columns>
<asp:BoundColumn DataField="FieldName" ReadOnly="True"
HeaderText="字段名"></asp:BoundColumn>
<asp:BoundColumn DataField="FieldAlias" HeaderText="字段中文别名">
</asp:BoundColumn>
<asp:TemplateColumn HeaderText="使用控件类型">
<ItemTemplate>
<FONT face="宋体"><asp:Label id="Label1" runat="server">
<%# DataBinder.(Container.DataItem,"ctltype") %>
</asp:Label></FONT>
</ItemTemplate>
<EditItemTemplate>
<FONT face="宋体"><asp:DropDownList id="DropDownList2" runat="server">
<asp:ListItem Value="1" Selected="True">单行文本框</asp:ListItem>
<asp:ListItem Value="2">多行文本框</asp:ListItem>
</asp:DropDownList></FONT>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="Identityfield" ReadOnly="True"
HeaderText="是否标识列"></asp:BoundColumn>
<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新"
CancelText="取消" EditText="编辑字段"></asp:EditCommandColumn>
</Columns>
<PagerStyle Font-Size="9pt" HorizontalAlign="Right" ForeColor="#3366FF"
Mode="NumericPages"></PagerStyle>
</asp:datagrid></td>
</tr>
</table>
</form>
......
7.5.1 RelatedTableFields.aspx页面文件代码
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;
using DataAccess;
namespace workflow.admin
{
/// <summary>
/// RelatedTableFields 的摘要说明。
/// 字段的控件类型即程序中录入字段数据的控件;其中隐藏域(控件类型为99)一项是针对标识字
///段的,每一个业务表都要有一个唯一性自增的标识字段用于区分业务流程关联的业务数据记录,对
///于该字段的值,是在创建流程实例时向业务数据表中插入新记录自动得到的;后续的任务就是对这
///条记录进行修改的过程.在实际录入界面中,标识字段要么不处理,要么只读,要么使用隐藏域控
///件,总之不能进行编辑.
/// </summary>
public class RelatedTableFields : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
protected System.Web.UI.WebControls.DropDownList DropDownList1;
protected System.Web.UI.HtmlControls.HtmlGenericControl Message;
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
//验证用户是否登录
if(Session["userid"] == null)
Response.Redirect("./Login.aspx");
string strSql="select * from RelatedTables";
DataSet ds=new Base().SQLExeDataSet(strSql);
DropDownList1.DataSource=ds;
DropDownList1.DataTextField="Description";
DropDownList1.DataValueField="TableID";
DropDownList1.DataBind();
ViewState["Tblnameower"]="";//记录业务表名称及创建者
BindGrid();
}
}
void BindGrid()
{
string tblname;
string tblower;
DataSet ds1;
//首次绑定显示的数据为关联表中的第一个业务表(关联表的第一条记录)。可以通过在下
//拉列表中选择其它业务表来改变DataGrid控件的绑定数据。
if(ViewState["Tblnameower"].ToString()=="")
{
//首次绑定数据时要为ViewState["Tblnameower"]赋一个值,避免后面
//DataGrid1_UpdateCommand在处理首次显示的数据时ViewState["Tblnameower"]为"".
ds1=new Base().SQLExeDataSet("select top 1 * from RelatedTables");
if(ds1 != null)
ViewState["Tblnameower"]=ds1;
tblname=ds1.Tables[0].Rows[0]["TableName"].ToString();
tblower=ds1.Tables[0].Rows[0]["Ower"].ToString();
}
else
{
ds1=(DataSet)ViewState["Tblnameower"];
tblname=ds1.Tables[0].Rows[0]["TableName"].ToString();
tblower=ds1.Tables[0].Rows[0]["Ower"].ToString();
}
//对于标识字段,控件类型要么为0(不考虑控件);要么为99(隐藏域)。总之不可编辑
string strSql="select *,(case ControlType when 1 then '单行文本框' when 2
then '多行文本框' when 99 then '隐藏域' else '' end) as ctltype,
(case IsIdentity when 'Y' then '是' else '' end) as Identityfield
from RelatedTablesFields
where TableName='"+tblname+"' and TableOwer='"+tblower+"'";
Base basecode=new Base();
DataSet ds=basecode.SQLExeDataSet(strSql);
DataGrid1.DataSource=ds;
DataGrid1.DataBind();
}
private void DataGrid1_PageIndexChanged(object source,
System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
BindGrid();
}
//点击下拉列表,重新选择DataGrid控件要绑定的业务表
private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)
{
string strSql="select TableName,Ower from RelatedTables where
TableID="+DropDownList1.SelectedValue.ToString ();
DataSet Tblnameower=new Base().SQLExeDataSet(strSql);
if(Tblnameower != null)
ViewState["Tblnameower"]=Tblnameower;
BindGrid();
}
//DataGrid编辑事件处理
private void DataGrid1_EditCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex=e.Item.ItemIndex;
BindGrid();
}
//DataGrid取消事件处理
private void DataGrid1_CancelCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex=-1;
BindGrid();
}
//DataGrid更新事件处理
private void DataGrid1_UpdateCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string fieldalias=((TextBox)e.Item.Cells[1].Controls[0]).Text.Trim();
Regex reg =new Regex(@"^[\u4e00-\u9fa5]*\w*$");//汉字或字母下划线
if(! reg.IsMatch(fieldalias))
{
((TextBox)e.Item.Cells[1].Controls[0]).Text="请输入汉字或字符序列";
return;
}
string ctltype=((DropDownList)e.Item.FindControl("DropDownList2"))
.SelectedValue;
DataSet ds1=(DataSet)ViewState["Tblnameower"];
string tblname=ds1.Tables[0].Rows[0]["TableName"].ToString();
string tblower=ds1.Tables[0].Rows[0]["Ower"].ToString();
//以下取值方式不能在这里使用(得不到值),可以在ItemDataBound事件函数中使用
//string fieldname=Convert.ToString(DataBinder.(e.Item.DataItem,"FieldName"));
string fieldname=DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
string Sql="update RelatedTablesFields set FieldAlias='"+fieldalias+"',
ControlType="+ctltype+" where TableName='"+tblname+"'
and TableOwer='"+tblower+"' and FieldName='"+fieldname+"'";
//Response.Write(Sql);//测试用语句
Base bs=new Base();
if(! bs.SQLExeNonQuery(Sql))
{
Message.InnerHtml=bs.BaseSqlErrDes;
Message.Style["color"]="red";
return;
}
else
{
DataGrid1.EditItemIndex=-1;
BindGrid();
}
}
//DataGrid控件绑定数据事件处理函数
private void DataGrid1_ItemDataBound(object sender,
System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.EditItem)
{
DropDownList ctltypelist=(DropDownList)e.Item.FindControl("DropDownList2");
//标识字段不显示控件选择
if(Convert.ToString(DataBinder.(e.Item.DataItem,"IsIdentity")) == "Y")
ctltypelist.Visible=false;
else
{
//如果控件类型不为空
if(DataBinder.(e.Item.DataItem,"ControlType")!= DBNull.Value)
ctltypelist.SelectedValue=
Convert.ToString(DataBinder.(e.Item.DataItem,"ControlType"));
ctltypelist.Visible=true;
}
}
}
}
}