終于趕出來了,現寫了一遍代碼。
感謝大家的支援,感謝大家提出自己的看法。衷心的感謝,真的。
應該是先寫第二步的,但是想一想還是先寫第三步吧。
一般大項目裡面都會有很多的基礎資訊的表,比如學曆、職稱等等,最近做了一個項目,居然有四十多個。如果一個一個地寫是不是太麻煩了呢?
下面就要介紹一種方法 —— 基本一個頁面搞定。
還是先說一下前提吧
VS2003 、 SQL2000 、 webform ,辦公系統裡的基礎資訊表的維護。
1、SQL2000裡的幾個系統表
寫過代碼生成器的Tx對這幾個表都很熟悉吧,sysobjects 、syscolumns 、systypes 。
請打開企業管理器(查詢分析器也可以),建立一個視圖,粘貼下面的SQL語句,然後儲存視圖,名字就叫做 V_Sys_TableInfo 吧,後面要用到的哦。
SELECT tbl.name AS TableName, tbl.xtype AS TableType, col.name AS FieldName,
tt.name AS FieldType, col.length AS FieldLength
FROM dbo.syscolumns col INNER JOIN
dbo.sysobjects tbl ON col.id = tbl.id INNER JOIN
dbo.systypes tt ON col.xtype = tt.xtype
WHERE (tbl.xtype = 'u') AND (tt.name <> N'sysname')
看不懂SQL語句沒關系,運作一下看看結果就知道了。你發現了什麼?你的資料庫裡的表名、字段名、字段類型和字段大小。
那麼這些資訊有什麼用呢?請先回顧一下第一步裡儲存資料都需要哪些元素。表名、字段名、使用者輸入的資訊。
知道我要怎麼用了吧,對,就是要通過表名來擷取表所擁有的字段名。
2、DataGrid是不是也可以這麼用。
開始繪制表單了。一個一個文本框的拖拽是不是挺煩的,那麼一起把需要的控件逗弄出來怎麼樣?
想想上面得到的記錄集,是不是可以利用一下呢?
建立一個UserControl ,拖一個DataGrid 出來,設定三列,第一列綁定 FieldName ,第二列空,第三列設定成模版列,放一個文本框。代碼如下
<asp:DataGrid id="DG" align="center" runat="server" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px"
BackColor="White" CellPadding="4" ForeColor="Black" AutoGenerateColumns="False">
<FooterStyle ForeColor="Black" BackColor="#CCCC99"></FooterStyle>
<SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#CC3333"></SelectedItemStyle>
<HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#333333"></HeaderStyle>
<Columns>
<asp:BoundColumn Visible="False" DataField="FieldName" HeaderText="FieldName"></asp:BoundColumn>
<asp:BoundColumn DataField="FieldName" HeaderText="字段名"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="控件">
<ItemTemplate>
<FONT face="宋體">
<hbs:HBSTextBox id="Txt" runat="server" Columns="30"></hbs:HBSTextBox></FONT>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
<PagerStyle HorizontalAlign="Right" ForeColor="Black" BackColor="White"></PagerStyle>
</asp:DataGrid>
<P>
<TABLE id="Table1" cellSpacing="1" cellPadding="1" width="100%" align="center" border="0">
<TR>
<TD align="center">&nbsp;
<asp:Button id="Btn_Save" runat="server" Width="70px" Text=" 确 定 "></asp:Button>&nbsp;<INPUT id="Btn_Return" onclick="myEsc()" type="button" value=" 返 回 " name="Btn_Return"></TD>
</TD></TR>
</TABLE>
</P>
進入背景,綁定DataGrid。想象一下會出現什麼樣的效果。
運作效果。
先不詳細說明了,發代碼先。
UserControl 頁面 BaseForm.ascx
<%
@ Register TagPrefix="HBS" Namespace="HBS.Controls" Assembly="HBSControls" %>
<asp:BoundColumn HeaderText="字段名"></asp:BoundColumn>
public class BaseForm : System.Web.UI.UserControl
{
Web 窗體設計器生成的代碼#region Web 窗體設計器生成的代碼
override protected void OnInit(EventArgs e)
//
// CODEGEN: 該調用是 ASP.NET Web 窗體設計器所必需的。
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// 設計器支援所需的方法 - 不要使用代碼編輯器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
this.Btn_Save.Click += new System.EventHandler(this.Btn_Save_Click);
this.Load += new System.EventHandler(this.Page_Load);
#endregion
protected System.Web.UI.WebControls.Button Btn_Save;
protected System.Web.UI.WebControls.DataGrid DG;
DataAccessLayer dal = new DataAccessLayer();
屬性#region 屬性
protected string Kind = "1";
protected string DataID = "";
private string _TableName = "";
/// 設定表名,用于添加和修改資料
public string TableName
get
{return _TableName;}
set
{_TableName = value;}
private string _FieldID = "";
/// 設定主鍵名,用于修改資料
public string FieldID
{return _FieldID;}
{_FieldID = value;}
private void Page_Load(object sender, System.EventArgs e)
// 在此處放置使用者代碼以初始化頁面
綁定#region 綁定
public void BindDataGrid()
this.DG.DataSource = dal.RunSqlDataTable("select * from V_Sys_TableInfo where TableName='" + _TableName + "'");
this.DG.DataBind();
//隐藏第一行
DG.Items[0].Visible = false;
儲存#region 儲存
private void Btn_Save_Click(object sender, System.EventArgs e)
//儲存資料
string[] str1 = new string[DG.Items.Count - 1];
string[] str = new string[DG.Items.Count - 1];
int i = -1;
foreach (DataGridItem item in DG.Items)
if (i != -1) //掠過第一行
//字段名
str1[i] = item.Cells[0].Text ;
//取值
str[i] = ((HBSTextBox)item.Cells[2].FindControl("Txt")).TextTrimNone;
}
i++;
}
儲存資料#region 儲存資料
switch (Kind )
case "1":
//添加時驗證是否有相同的記錄,代碼略。寫多了會影響這裡的主題
//添加資料
dal.InsertDataStr(_TableName,str1,str);
break;
case "2":
//修改時驗證是否有相同的記錄,代碼略。寫多了會影響這裡的主題
//修改資料
dal.UpdateData(_TableName,str1,str, _FieldID + " = " + DataID);
#endregion
檢查是否出現異常#region 檢查是否出現異常
if (dal.ErrorMsg.Length > 2)
Functions.PageRegisterAlert(Page,"儲存資料的時候出現意外情況,請與管理者聯系!");
return ;
Functions.PageRegisterAlert(Page,"儲存成功!");
}
表單頁面 MoreTable.aspx
<body MS_POSITIONING="FlowLayout">
<form id="Form1" method="post" runat="server">
<uc1:BaseForm id="myForm" runat="server" TableName="News"></uc1:BaseForm>
</form>
</body>
//請注意這裡,在VS2003裡面,這行是不會自動出現的,需要手動填寫。
protected JYK.Test.UC.BaseForm myForm; //使用者控件
Response.Cache.SetNoStore();
if (!Page.IsPostBack)
myForm.BindDataGrid();
//把英文的字段名改成中文的
myForm.DG.Items[1].Cells[1].Text = "分類";
myForm.DG.Items[2].Cells[1].Text = "内容";
myForm.DG.Items[3].Cells[1].Text = "标題";
myForm.DG.Items[4].Cells[1].Text = "編輯";
使用者控件隻使用一個就可以了。(不知道這算不算抽象)
表單控件是一個頁面對應一個資料表,其實也就是設定一下表名,和顯示一下字段的中文名。
優點呢:代碼少,其他的就不說了。
缺點就很多了:隻能用文本框、要單獨設定中文名、頁面死闆不靈活、不夠OO,隻能單表操作。
不過除了不夠OO(準确點說是一點都不OO:)),其他的是都可以改進的。至于怎麼改進,如果您感興趣可以想一想,方法實在是太多了。
ps:我現在寫程式并不是用的這種方法,隻是思路是一樣的。這種方法,是我剛寫的,在實際中沒有應用過的。