首先設計的是[系統管理]模組,這也是一般系統的步驟.
簡略的UML活動圖表如下:
資料庫有:
登入日誌資訊表LogInfo
動作記錄資訊表sysOptLog
機構基本資料表mrBranch
部門基本資料表mrDepartment [機構比部門大一級,機構可以包括多個部門]
人員基本資料表mrBaseInf [也就是使用者表]
模組基本資料表sysFuncDic
角色基本資料表sysRolesDic
使用者角色關係表sysEmpRoles
模組角色關係表sysFuncRights
目錄基本資料表sysTab
一個使用者可以對應多個角色,而一個角色可以包含多個使用者:一個角色可以包含多個模組,一個模組也可以對應多個角色.所以,他們全部都是多對多的關係,可以處理複雜的許可權問題.
一.管理登入日誌
對SQL操作全部使用預存程序.;對所有的頁面全部繼承基類PageBase.cs
1.通用類中用到一個比較常用的函數:(刪除不可見字元函數)
public static string DeleteUnVisibleChar(string sourceString)
{
System.Text.StringBuilder sBuilder = new System.Text.StringBuilder(131);
for(int i = 0;i < sourceString.Length; i++)
{
int Unicode = sourceString[i];
if(Unicode >= 16)
{
sBuilder.Append(sourceString[i].ToString());
}
}
return sBuilder.ToString();
}
2.自由操縱DataGrid.
可以使用一些技巧來自由操縱DataGrid:
(1)比如要在每行頭部加入CheckBox,可以加入一個模板列,模板中放入一個CheckBox控制項:
<asp:TemplateColumn>
<ItemTemplate>
<asp:CheckBox id="CheckBox1" runat="server"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
其他的繫結資料行不要變,這樣就會出現一個CheckBox,比如用於選中的多項刪除操作.但是如何在程式中實現刪除操作呢?首先將datagrid的DataKeyField關鍵字段設定為要刪除所需的關鍵字段(比如使用者ID),然後在刪除處理時,通過對每行的第一列的第一個控制項(即CheckBox,但沒有ID,所以必須這樣做)來判斷: foreach(DataGridItem thisItem in DataGridLogininfo.Items)
{
if(((CheckBox)thisItem.Cells[0].Controls[1]).Checked) //表示此一行的第一列中的第一個控制項
{
string strLoginID = DataGridLogininfo.DataKeys[thisItem.ItemIndex].ToString(); //設定DataGridLogininfo的DataKeyField為LoginID
DelLoginLog(strLoginID);
}
}
這樣,"全部選中"的CheckBox2的代碼也簡單了:
foreach(DataGridItem thisItem in DataGridLogininfo.Items)
{
((CheckBox)thisItem.Cells[0].Controls[1]).Checked = CheckBox2.Checked;
}
同樣,我們可以擴充,比如為每條記錄前面加個序號,如何加?
有兩種方法:
第一種,和前面一樣,加一個模板列,用一個頁面全域變數的number++;
第二種,對綁定前得到的DataTable進行處理,加入一列:
DataTable mytable=myclass.Getalllogininfo ();
DataColumn mycolumn= mytable.Columns.Add ("number",System.Type .GetType ("System.String")); //在資料來源DataTable中加入一列,注意技巧
for (int i=0;i<mytable.Rows.Count ;i++)
{
mytable.Rows [i]["number"]=(i+1).ToString ();
}
這是一個很重要的方法,如果要對綁定資料實現複雜的操作,常常要用到這個原理.
還有,如何加入比較複雜的功能,比如,滑鼠到每一條記錄上都變色呢?
這個可以通過DataGrid的ItemDataBound事件來處理,可以給每一項加上屬性,方法如下:
//綁定Javascript指令碼到每行,是滑鼠指向時顏色變化
private void DataGridLogininfo_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
ListItemType itemType = e.Item.ItemType;
if (itemType == ListItemType.Item )
{
e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor='#dedfde';";
e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor='#fff7ce';cursor='hand';" ;
}
else if( itemType == ListItemType.AlternatingItem)
{
e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor='#ffffff';";
e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor='#fff7ce';cursor='hand';" ;
}
}
二.管理動作記錄
與上面一個沒什麼區別,同樣要利用PageBase的PageBegin方法,這樣可以確定所在的模組並檢查許可權,頁面基類的好處已經體現出來了.
檢視狀態ViewState在ASP.NET裡是預設存在的,在表單的發送之間幾乎所有的ASP.NET控制項都會保留屬性值.它實際上就是一個隱藏的表單域,即HIDDEN的INPUT.
為伺服器控制項添加javascript指令碼: Button1.Attributes.Add("onclick", "javascript:alert('cool!'");
三.模組管理
模組管理再次證明了一點:只有想不到,沒有做不到的.
裡面對於許可權的DataList綁定CheckBoxList的複雜處理可謂精彩絕倫.
如果對於綁定到DataList等裡面的控制項操作,一般都要使用
(ControlType)DataList.Items[Index].FindControl("ControlName")來取得控制項,然後進行處理.
對於命令按鈕,都要設定CommandName,然後在DataList_ItemCommand裡面通過判斷來進行處理,所以CommandName不僅僅是可以用edit或delete,還可以多種多樣,處理十分靈活.
由於類中的串連常常是局部變數,外部調用時不可能關閉,所以用
DataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
這樣自動關閉串連比較實用.
四.目錄管理
這裡主要有一個知識點:如果編輯比較簡單,可以直接用DataGrid的自有編輯方法:
這裡,主要有dgCatalog_EditCommand,dgCatalog_DeleteCommand,dgCatalog_CancelCommand,dgCatalog_UpdateCommand這幾個事件.同樣,都是先取得DataKey關鍵字,然後進行處理;Update的時候,同樣是取得(TextBox)Cells[0].Controls[1].Text這樣的值,然後再運行預存程序等等更新.