用“已知”的办法解决“未知”的办法---.NET连动控件和统计数量
生活随笔
收集整理的這篇文章主要介紹了
用“已知”的办法解决“未知”的办法---.NET连动控件和统计数量
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
好幾天沒(méi)更新博客了,這幾天都忙著修改代碼。我老大(豪客)給我的任務(wù)還是比較重的,o(∩_∩)o...哈哈,今天就跟大家聊一下這幾天的收獲。希望能跟大家一起分享。 首先以前頁(yè)面的截圖如下: 更新后的截圖如下: 更新2個(gè)”查詢“限制條件,以便能查詢下面表中更詳細(xì)的內(nèi)容,還有一個(gè)“統(tǒng)計(jì)”按鈕,統(tǒng)計(jì)當(dāng)前條件下表中的“項(xiàng)目狀態(tài)”為“結(jié)束”、“進(jìn)行中”、“被關(guān)閉”、“停止”的項(xiàng)目分別有多少個(gè)。 我用“項(xiàng)目狀態(tài)”的下拉控件舉例,“完成日期”、“項(xiàng)目類型”和它實(shí)現(xiàn)差不多。 1.頁(yè)面代碼: <asp:DropDownList ID="DropDownList3" runat="server" DataSource="<%# ProjectZt %>"?? DataTextField="codeText" DataValueField="codeValue" OnDataBound="DropDownList3_DataBound">
????????????????????????????????</asp:DropDownList> 說(shuō)明:在頁(yè)面的Table中增加一個(gè)dropdownlist控件。當(dāng)中的參數(shù)在大家耐心慢慢看下去就知道是什么意思了。 2.后臺(tái)代碼片段: public DataTable ProjectZt
????????{
????????????get
????????????{
????????????????return (new CommonBLL()).GetZt_new("projectStatusType");
????????????}
????????} 說(shuō)明:頁(yè)面中的DataSource綁定的數(shù)據(jù)在后臺(tái)中實(shí)現(xiàn)。并且調(diào)用業(yè)務(wù)邏輯層(BLL)的類CommonBLL。 3.業(yè)務(wù)邏輯層中CommonBLL的代碼片段: public DataTable GetZt_new(string type)
????????{
????????????DataTable table;
????????????table = CommonDA.GetCodeList3(type).Tables[0];
????????????return table;
????????} 說(shuō)明:程序繼續(xù)調(diào)用數(shù)據(jù)邏輯層(DAL),并且返回table。 4.數(shù)據(jù)訪問(wèn)層中CommonDA的代碼片段: public static DataSet GetCodeList3(string typeName)
????????{
????????????SqlConnection conn = new SqlConnection();
????????????conn.ConnectionString = CONN;
????????????string sql = "select a.codeValue, a.codeText, a.subId from bsCodeList a "
????????????????+ "INNER JOIN bsCodeType b ON a.codeType = b.id where (b.name = '" + typeName + "')";
????????????SqlCommand objcommand = new SqlCommand();
????????????objcommand.Connection = conn;
????????????objcommand.CommandType = CommandType.Text;
????????????objcommand.CommandText = sql;
????????????SqlDataAdapter commandAdp = new SqlDataAdapter();
????????????commandAdp.SelectCommand = objcommand;
????????????DataSet data = new DataSet();
????????????commandAdp.Fill(data, "CodeList3");
????????????conn.Close();
????????????return data;
????????} 說(shuō)明:這一層開(kāi)始調(diào)用數(shù)據(jù)庫(kù)中的表,并且獲取數(shù)據(jù)。沒(méi)什么太難的,都是固定語(yǔ)句,只是一步一步的調(diào)用,當(dāng)然直接從后臺(tái)文件里直接調(diào)用這一層也可以,或者直接寫入后臺(tái)都可以。這樣寫的代碼清晰性會(huì)好一些。 5.所設(shè)計(jì)到的數(shù)據(jù)庫(kù):(兩個(gè)表) 說(shuō)明:數(shù)據(jù)訪問(wèn)層中的string sql = "select a.codeValue, a.codeText, a.subId from bsCodeList a "
??????????????? + "INNER JOIN bsCodeType b ON a.codeType = b.id where (b.name = '" + typeName + "')"就是調(diào)用數(shù)據(jù)庫(kù)的方法,當(dāng)然也可以寫到數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程中,直接調(diào)用存儲(chǔ)過(guò)程訪問(wèn)數(shù)據(jù)庫(kù)。 大家可能已經(jīng)都注意到了。數(shù)據(jù)庫(kù)中有兩個(gè)頁(yè)面中出現(xiàn)的參數(shù)codeValue和codeText,讓我們“return 1.頁(yè)面代碼”,這兩個(gè)就綁定在控件中DataValueField和DataTextField中,DataTextField就是我們看到綁定的內(nèi)容。 到這里控件的內(nèi)容我們綁定好了,下面我們就要實(shí)現(xiàn)當(dāng)我們選中當(dāng)中的內(nèi)容時(shí),點(diǎn)“查詢”或者“統(tǒng)計(jì)”按鈕,下面顯示的表(DataGrid控件)重新綁定我們規(guī)定條件的數(shù)據(jù)。 6.讓我們“return 2.后臺(tái)代碼”: 實(shí)現(xiàn)完控件的綁定,下面就是Page_Load中的代碼,這里面的代碼意思是,當(dāng)頁(yè)面加載的時(shí)候所實(shí)現(xiàn)的功能,即用戶向服務(wù)端每提交一次請(qǐng)求就加載當(dāng)中的命令。當(dāng)中有個(gè)很重要的語(yǔ)句If(!IsPostBack),意思是當(dāng)頁(yè)面是用戶第一次加載的時(shí)候要執(zhí)行的命令。這里有熟悉的朋友也有不熟悉的朋友,所以我盡量用簡(jiǎn)短的話來(lái)描述一下,如果還不是太清楚就試一試有無(wú)這個(gè)命令I(lǐng)f(!IsPostBack)時(shí)的效果。 代碼片段: if (!IsPostBack)
????????????{
????????????????CheckBox1.Checked = false;
???????????????? //“不分頁(yè)”控件是實(shí)現(xiàn)下面顯示表(DataGrid)是否分頁(yè)要求的。在頁(yè)面第一次加載默認(rèn)是分頁(yè)的
????????????????if (Session["PrjType"] != null && Session["PrjTypeTime"] != null && Session["ProjectStatus"] != null)
????????????????{
????????????????????prjType = SessionGetInt("PrjType");
????????????????????dropProjectType.DataBind();
????????????????????dropProjectType.SelectedValue = Session["PrjType"].ToString();
????????????????????prjTypeTime = SessionGetInt("PrjTypeTime");
????????????????????DropDownList1.DataBind();
????????????????????DropDownList1.SelectedValue = Session["PrjTypeTime"].ToString();
????????????????????prjTypeZt = SessionGetInt("PrjTypeZt");
????????????????????DropDownList3.DataBind();
????????????????????DropDownList3.SelectedValue = Session["PrjTypeZt"].ToString();
????????????????}
????????????????else
????????????????{
????????????????????prjType = 0;
????????????????????dropProjectType.DataBind();
????????????????????dropProjectType.SelectedValue = "0";
????????????????????prjTypeTime = 0;
????????????????????DropDownList1.DataBind();
????????????????????DropDownList1.SelectedValue = "0";
????????????????????prjTypeZt = 3;
????????????????????DropDownList3.DataBind();
????????????????????DropDownList3.SelectedValue = "3";
????????????????}
??????????????? BindProjects(prjType, prjTypeTime, prjTypeZt); //根據(jù)目前3個(gè)條件綁定數(shù)據(jù)
Session["PrjType"] = null;
????????????????Session["PrjTypeTime"] = null;
????????????????Session["PrjTypeZt"] = null;
????????????}
????????????else
????????????{ //頁(yè)面繼承了一個(gè)基類PageBase,當(dāng)中已經(jīng)封裝好了方法和類。
????????????????prjType = SessionGetInt("PrjType");
????????????????prjTypeTime = SessionGetInt("PrjTypeTime");
????????????????prjTypeZt = SessionGetInt("PrjTypeZt");
????????????}
說(shuō)明:頁(yè)面綁定3個(gè)限制條件控件的初始值,根據(jù)目前的條件進(jìn)行加載。其他的參數(shù)設(shè)置頁(yè)面的默認(rèn)屬性,以便當(dāng)用戶執(zhí)行完一個(gè)過(guò)程后回到頁(yè)面初始。 這里有一個(gè)小技巧,就是我們?cè)?個(gè)下拉控件中已經(jīng)綁定好了內(nèi)容,但是我定義了,一個(gè)“所有類型”,也就是當(dāng)某個(gè)控件的條件為“所有類型”的時(shí)候,它就不具有任何的限制了。 代碼片段: protected void DropDownList3_DataBound(object sender, EventArgs e)
????????{
????????????ListItem item = new ListItem("所有類型", "3");
????????????DropDownList drop = (DropDownList)sender;
????????????drop.Items.Add(item);
????????} 說(shuō)明:在DataBound事件中新添加一個(gè)選項(xiàng)“所有類型”。大家“return 5.所設(shè)計(jì)到的數(shù)據(jù)庫(kù)”,看codeValue一列數(shù)據(jù),代碼中的“3”是為了區(qū)別于其他的選項(xiàng),其他兩個(gè)下拉控件,因?yàn)槭菑摹?”開(kāi)始寫入到數(shù)據(jù)庫(kù)的,所以就用“0”表示新增了。 7.綁定 private void BindProjects(int type, int typetime, int typezt)
????????{
????????????ProjectsCollection projectList = Project.GetProjects(_user.UserID, _user.Role, Convert.ToInt32(dropProjectType.SelectedValue), Convert.ToInt32(DropDownList1.SelectedValue), Convert.ToInt32(DropDownList3.SelectedValue));
????????????SortGridData(projectList, SortField, SortAscending);
ProjectsGrid.DataSource = projectList;
????????????try
????????????{
????????????????ProjectsGrid.DataBind();
????????????}
????????????catch
????????????{
????????????????ProjectsGrid.CurrentPageIndex = (ProjectsGrid.CurrentPageIndex - 1 > 0 ? ProjectsGrid.CurrentPageIndex - 1 : 0);
????????????????ProjectsGrid.DataBind();
????????????)????????
????????} 說(shuō)明:這一段代碼用到了兩個(gè)業(yè)務(wù)邏輯層的類ProjectsCollection和Project。userid和role是控制權(quán)限用的,不用管它。在綁定顯示表的時(shí)候(ProjectsGrid.DataBind()),一定要做溢出判斷,否則會(huì)出現(xiàn)BUG。 ProjectsCollection.cs代碼提供一個(gè)封裝數(shù)據(jù)的功能。那些數(shù)據(jù)就是Project.cs所用到的。 Project.cs代碼片段: public static ProjectsCollection GetProjects(int userID, string role, int type, int typetime, int typezt)
????????{
????????????DataSet ds = SqlHelper.ExecuteDataset(
????????????????ConfigurationManager.AppSettings["ConnectionString"],
????????????????"PM_ListProjectsTime", userID, Convert.ToInt32(role));
ProjectsCollection projects = new ProjectsCollection();
????????????foreach (DataRow r in ds.Tables[0].Rows)
????????????{
????????????????Project prj = new Project();
????????????????prj.ProjectType = Convert.ToInt32(r["ProjectType"]);
prj.ProjectTypeTime = Convert.ToInt32(r["ProjectTypeTime"]);
????????????????????prj.ProjectStatus = Convert.ToInt32(r["ProjectStatus"]);
????????????????????if ((type == 0 || prj.ProjectType == type) && (typetime == 0 || prj.ProjectTypeTime == typetime) && (typezt == 3 || prj.ProjectStatus == typezt))
??????????????????????? {
??????????????????????????? prj.ProjectID = Convert.ToInt32(r["ProjectID"]);??????????????????????? prj.Name = r["ProjectName"].ToString();
??????????????????????????? prj.Description = r["Description"].ToString();
??????????????????????????? prj.ProjectCode = r["ProjectCode"].ToString();
??????????????????????????? prj.ManagerUserID = Convert.ToInt32(r["ManagerUserID"]);
????????????????????????????prj.ManagerUserName = Convert.ToString(r["Username"]);
???????????????????????????? prj.EstCompletionDate = Convert.ToDateTime(r["EstCompletionDate"]);
???????????????????????????? prj.EstDuration = Convert.ToDecimal(r["EstDuration"]);
????????????????????????//prj.ProjectStatus = Convert.ToInt32(r["ProjectStatus"]);
???????????????????????????? projects.Add(prj);
?????????????????????????}
??????????????
????????????}
????????????return projects;
????????} 說(shuō)明:當(dāng)中設(shè)計(jì)到的一個(gè)數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程PM_ListProjectsTime ????????? PM_ListProjectsTime代碼入下:
CREATE?? PROCEDURE PM_ListProjectsTime
(
????@UserID int,
????@RoleID int
)
AS
IF @RoleID = 1 /*全部*/
BEGIN
????SELECT ProjectID,??
??Name as ProjectName,??
??Description,??
??ManagerUserID,??
??EmpName as UserName,
??EstCompletionDate,??
??EstDuration,
??ProjectCode,
??ProjectStatus,
??ProjectType,
??ProjectTypeTime
????FROM??
??PM_Projects
????INNER JOIN
??mrBaseInf
????ON??
??ManagerUserID = EmpID??order by ProjectName
END
ELSE IF @RoleID = 2??/*自己管的項(xiàng)目*/
BEGIN
????SELECT ProjectID,??
??Name as ProjectName,??
??Description,??
??ManagerUserID,??
??EmpName as UserName,
??EstCompletionDate,??
??EstDuration,
??ProjectCode,
??ProjectType,
??ProjectTypeTime,
??ProjectStatus
????FROM??
??PM_Projects
????INNER JOIN
??mrBaseInf
????ON??
??ManagerUserID = EmpID
????WHERE ManagerUserID = @UserID??order by ProjectName
END
GO
說(shuō)明:根據(jù)條件,獲得參數(shù),然后傳到后臺(tái),再根據(jù)頁(yè)面中綁定的Value值來(lái)綁定具體的內(nèi)容。 到現(xiàn)在也實(shí)現(xiàn)好根據(jù)條件綁定下面表的內(nèi)容了。 8.兩個(gè)控件“查詢”和“統(tǒng)計(jì)”功能的實(shí)現(xiàn)。 “查詢”功能代碼: protected void Button1_Click(object sender, EventArgs e)
{ //因?yàn)橄旅姹?ProjectsGrid)是分頁(yè)的,所以我定義每次查詢都看到的是第一頁(yè)。也就是簡(jiǎn)單的復(fù)位功能
??????????????? ProjectsGrid.CurrentPageIndex = 0;
????????????????Session["PrjType"] = Convert.ToInt32(dropProjectType.SelectedValue);
????????????????Session["PrjTypeTime"] = Convert.ToInt32(DropDownList1.SelectedValue);
????????????????Session["PrjTypeZt"] = Convert.ToInt32(DropDownList3.SelectedValue); //我在這里也做了異常處理,后面我會(huì)做解釋。這里大家可以直接理解為:BindProjects(Convert.ToInt32(dropProjectType.SelectedValue), Convert.ToInt32(DropDownList1.SelectedValue), Convert.ToInt32(DropDownList3.SelectedValue));
????????????????try
????????????????{
????????????????????BindProjects(Convert.ToInt32(dropProjectType.SelectedValue), Convert.ToInt32(DropDownList1.SelectedValue), Convert.ToInt32(DropDownList3.SelectedValue));
????????????????????????????????????}
????????????????catch
????????????????{
????????????????????ProjectsGrid.CurrentPageIndex = (ProjectsGrid.CurrentPageIndex - 1 > 0 ? ProjectsGrid.CurrentPageIndex - 1 : 0);
????????????????????BindProjects(Convert.ToInt32(dropProjectType.SelectedValue), Convert.ToInt32(DropDownList1.SelectedValue), Convert.ToInt32(DropDownList3.SelectedValue));
????????????????????????????????????}
????????????} “統(tǒng)計(jì)”按鈕也是我越到的一個(gè)麻煩,因?yàn)槲乙y(tǒng)計(jì)當(dāng)前表中數(shù)據(jù)“項(xiàng)目狀態(tài)”的情況,時(shí)間有點(diǎn)緊,我測(cè)試了很多辦法都沒(méi)有成功。 代碼片段: protected void ProjectsGrid_ItemDataBound(object sender, DataGridItemEventArgs e)
??????? { if (e.Item.ItemType == ListItemType.Item ||
????????????????????e.Item.ItemType == ListItemType.AlternatingItem)
????????????{
????????????????Label lbl = (Label)e.Item.Cells[3].Controls[1];
????????????????int status = Int32.Parse(lbl.Text);
????????????????switch (status)
????????????????{
????????????????????case 0:
????????????????????????lbl.Text = "結(jié)束";
????????????????????????lbl.BackColor = System.Drawing.Color.Gray;
??????????????????
????????????????????????break;
????????????????????case 1:
????????????????????????lbl.Text = "進(jìn)行中";
????????????????????????break;
????????????????????case -1:
????????????????????????lbl.Text = "被關(guān)閉";
????????????????????????lbl.BackColor = System.Drawing.Color.Red;
????????????????????????break;
????????????????????case -2:
????????????????????????lbl.Text = "停止";
????????????????????????lbl.BackColor = System.Drawing.Color.Red;
????????????????????????break;
????????????????}
????????????????
????????????????if (lbl.Text == "結(jié)束")
????????????????{
????????????????????m6 = m6 + 1;
????????????????????Label7.Text = "共" + m6.ToString() + "個(gè)";
????????????????}
????????????????if (lbl.Text == "進(jìn)行中")
????????????????{
????????????????????m7 = m7 + 1;
????????????????????Label8.Text = "共" + m7.ToString() + "個(gè)";
????????????????}
????????????????if (lbl.Text == "被關(guān)閉")
????????????????{
????????????????????m8 = m8 + 1;
????????????????????Label9.Text = "共" + m8.ToString() + "個(gè)";
????????????????}
????????????????if (lbl.Text == "停止")
????????????????{
????????????????????m10 = m10 + 1;
????????????????????Label10.Text = "共" + m10.ToString() + "個(gè)";
????????????????}
????????????} } 說(shuō)明:這個(gè)方法是表中的項(xiàng)被綁定時(shí)候激發(fā),表中在“項(xiàng)目狀態(tài)”那一列綁定了一個(gè)Label控件,用來(lái)顯示文字。所以在switch中根據(jù)獲取來(lái)的Value值來(lái)判斷顯示的文字和背景顏色,后面我加的這段代碼是顯示當(dāng)前頁(yè)面的各個(gè)狀態(tài)的數(shù)量,注意其實(shí)表是默認(rèn)分頁(yè)的,所以我統(tǒng)計(jì)的只能是當(dāng)前一個(gè)頁(yè)面的數(shù)據(jù)。 ??????? 我們“return “統(tǒng)計(jì)”按鈕”,我用了一個(gè)已知的辦法解決這個(gè)未知的辦法,就是當(dāng)我們點(diǎn)統(tǒng)計(jì)的時(shí)候,下面表(ProjectGrid)的ProjectsGrid.AllowPaging = false,意思是不允許分頁(yè),那么我就可以統(tǒng)計(jì)出來(lái)了,并且把右上角的“不分頁(yè)”勾上,當(dāng)我們?cè)冱c(diǎn)“查詢”和“不分頁(yè)”的時(shí)候,頁(yè)面就不會(huì)再顯示“項(xiàng)目狀態(tài)”那一行的數(shù)量了,因?yàn)槿绻环猪?yè)我感覺(jué)會(huì)數(shù)據(jù)量比較大,頁(yè)面緩沖比較慢,如果不點(diǎn)“統(tǒng)計(jì)”功能,就不要顯示統(tǒng)計(jì)功能了。當(dāng)然“統(tǒng)計(jì)”功能也要綁定數(shù)據(jù),就是也同時(shí)擁有“查詢”功能,只是不分頁(yè)顯示。 總結(jié):我想大家如果看完這篇文章肯定玉石俱焚了,如果能看一半我已經(jīng)很滿足了。在當(dāng)中我遇到兩個(gè)問(wèn)題: 1.溢出問(wèn)題,我調(diào)試了好長(zhǎng)時(shí)間,才不會(huì)出現(xiàn)漏洞。一開(kāi)始在點(diǎn)“查詢”的時(shí)候有時(shí)就出現(xiàn)BUG,頁(yè)面無(wú)相應(yīng),我加上判斷語(yǔ)句后已經(jīng)好了,但是新問(wèn)題又出現(xiàn)了,因?yàn)轫?yè)面是允許分頁(yè)的,我點(diǎn)“2”或者其他頁(yè)面后,然后再根據(jù)新條件查詢又會(huì)有漏洞,最后在DataGrid分頁(yè)時(shí)間中有這兩句:ProjectsGrid.CurrentPageIndex = e.NewPageIndex;Session["PM_ListIndex"] = e.NewPageIndex;我把Session["PM_ListIndex"] = e.NewPageIndex;去掉就不會(huì)再有BUG了,我也不知道原因,希望高人能指點(diǎn):-) 2.我一開(kāi)始想讓頁(yè)面即使允許分頁(yè)也能把全部的數(shù)據(jù)都統(tǒng)計(jì)出來(lái),我試了很多方法,還是沒(méi)試出來(lái),希望能有高人指點(diǎn),現(xiàn)在把全部數(shù)據(jù)堆到一個(gè)頁(yè)面點(diǎn)“統(tǒng)計(jì)”我感覺(jué)會(huì)有一點(diǎn)慢。 我知道我自己?jiǎn)锇肃碌膶懩敲炊嗪苌贂?huì)有耐心能看完,但是我覺(jué)得我該完這個(gè)東西我收獲很大,所以我希望跟大家分享,我還比較菜,希望大家多多指點(diǎn)。 信心和努力伴隨著我們,讓我們一起眺望遠(yuǎn)方,即使遠(yuǎn)方很遠(yuǎn)~~
????????????????????????????????</asp:DropDownList> 說(shuō)明:在頁(yè)面的Table中增加一個(gè)dropdownlist控件。當(dāng)中的參數(shù)在大家耐心慢慢看下去就知道是什么意思了。 2.后臺(tái)代碼片段: public DataTable ProjectZt
????????{
????????????get
????????????{
????????????????return (new CommonBLL()).GetZt_new("projectStatusType");
????????????}
????????} 說(shuō)明:頁(yè)面中的DataSource綁定的數(shù)據(jù)在后臺(tái)中實(shí)現(xiàn)。并且調(diào)用業(yè)務(wù)邏輯層(BLL)的類CommonBLL。 3.業(yè)務(wù)邏輯層中CommonBLL的代碼片段: public DataTable GetZt_new(string type)
????????{
????????????DataTable table;
????????????table = CommonDA.GetCodeList3(type).Tables[0];
????????????return table;
????????} 說(shuō)明:程序繼續(xù)調(diào)用數(shù)據(jù)邏輯層(DAL),并且返回table。 4.數(shù)據(jù)訪問(wèn)層中CommonDA的代碼片段: public static DataSet GetCodeList3(string typeName)
????????{
????????????SqlConnection conn = new SqlConnection();
????????????conn.ConnectionString = CONN;
????????????string sql = "select a.codeValue, a.codeText, a.subId from bsCodeList a "
????????????????+ "INNER JOIN bsCodeType b ON a.codeType = b.id where (b.name = '" + typeName + "')";
????????????SqlCommand objcommand = new SqlCommand();
????????????objcommand.Connection = conn;
????????????objcommand.CommandType = CommandType.Text;
????????????objcommand.CommandText = sql;
????????????SqlDataAdapter commandAdp = new SqlDataAdapter();
????????????commandAdp.SelectCommand = objcommand;
????????????DataSet data = new DataSet();
????????????commandAdp.Fill(data, "CodeList3");
????????????conn.Close();
????????????return data;
????????} 說(shuō)明:這一層開(kāi)始調(diào)用數(shù)據(jù)庫(kù)中的表,并且獲取數(shù)據(jù)。沒(méi)什么太難的,都是固定語(yǔ)句,只是一步一步的調(diào)用,當(dāng)然直接從后臺(tái)文件里直接調(diào)用這一層也可以,或者直接寫入后臺(tái)都可以。這樣寫的代碼清晰性會(huì)好一些。 5.所設(shè)計(jì)到的數(shù)據(jù)庫(kù):(兩個(gè)表) 說(shuō)明:數(shù)據(jù)訪問(wèn)層中的string sql = "select a.codeValue, a.codeText, a.subId from bsCodeList a "
??????????????? + "INNER JOIN bsCodeType b ON a.codeType = b.id where (b.name = '" + typeName + "')"就是調(diào)用數(shù)據(jù)庫(kù)的方法,當(dāng)然也可以寫到數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程中,直接調(diào)用存儲(chǔ)過(guò)程訪問(wèn)數(shù)據(jù)庫(kù)。 大家可能已經(jīng)都注意到了。數(shù)據(jù)庫(kù)中有兩個(gè)頁(yè)面中出現(xiàn)的參數(shù)codeValue和codeText,讓我們“return 1.頁(yè)面代碼”,這兩個(gè)就綁定在控件中DataValueField和DataTextField中,DataTextField就是我們看到綁定的內(nèi)容。 到這里控件的內(nèi)容我們綁定好了,下面我們就要實(shí)現(xiàn)當(dāng)我們選中當(dāng)中的內(nèi)容時(shí),點(diǎn)“查詢”或者“統(tǒng)計(jì)”按鈕,下面顯示的表(DataGrid控件)重新綁定我們規(guī)定條件的數(shù)據(jù)。 6.讓我們“return 2.后臺(tái)代碼”: 實(shí)現(xiàn)完控件的綁定,下面就是Page_Load中的代碼,這里面的代碼意思是,當(dāng)頁(yè)面加載的時(shí)候所實(shí)現(xiàn)的功能,即用戶向服務(wù)端每提交一次請(qǐng)求就加載當(dāng)中的命令。當(dāng)中有個(gè)很重要的語(yǔ)句If(!IsPostBack),意思是當(dāng)頁(yè)面是用戶第一次加載的時(shí)候要執(zhí)行的命令。這里有熟悉的朋友也有不熟悉的朋友,所以我盡量用簡(jiǎn)短的話來(lái)描述一下,如果還不是太清楚就試一試有無(wú)這個(gè)命令I(lǐng)f(!IsPostBack)時(shí)的效果。 代碼片段: if (!IsPostBack)
????????????{
????????????????CheckBox1.Checked = false;
???????????????? //“不分頁(yè)”控件是實(shí)現(xiàn)下面顯示表(DataGrid)是否分頁(yè)要求的。在頁(yè)面第一次加載默認(rèn)是分頁(yè)的
????????????????if (Session["PrjType"] != null && Session["PrjTypeTime"] != null && Session["ProjectStatus"] != null)
????????????????{
????????????????????prjType = SessionGetInt("PrjType");
????????????????????dropProjectType.DataBind();
????????????????????dropProjectType.SelectedValue = Session["PrjType"].ToString();
????????????????????prjTypeTime = SessionGetInt("PrjTypeTime");
????????????????????DropDownList1.DataBind();
????????????????????DropDownList1.SelectedValue = Session["PrjTypeTime"].ToString();
????????????????????prjTypeZt = SessionGetInt("PrjTypeZt");
????????????????????DropDownList3.DataBind();
????????????????????DropDownList3.SelectedValue = Session["PrjTypeZt"].ToString();
????????????????}
????????????????else
????????????????{
????????????????????prjType = 0;
????????????????????dropProjectType.DataBind();
????????????????????dropProjectType.SelectedValue = "0";
????????????????????prjTypeTime = 0;
????????????????????DropDownList1.DataBind();
????????????????????DropDownList1.SelectedValue = "0";
????????????????????prjTypeZt = 3;
????????????????????DropDownList3.DataBind();
????????????????????DropDownList3.SelectedValue = "3";
????????????????}
??????????????? BindProjects(prjType, prjTypeTime, prjTypeZt); //根據(jù)目前3個(gè)條件綁定數(shù)據(jù)
Session["PrjType"] = null;
????????????????Session["PrjTypeTime"] = null;
????????????????Session["PrjTypeZt"] = null;
????????????}
????????????else
????????????{ //頁(yè)面繼承了一個(gè)基類PageBase,當(dāng)中已經(jīng)封裝好了方法和類。
????????????????prjType = SessionGetInt("PrjType");
????????????????prjTypeTime = SessionGetInt("PrjTypeTime");
????????????????prjTypeZt = SessionGetInt("PrjTypeZt");
????????????}
說(shuō)明:頁(yè)面綁定3個(gè)限制條件控件的初始值,根據(jù)目前的條件進(jìn)行加載。其他的參數(shù)設(shè)置頁(yè)面的默認(rèn)屬性,以便當(dāng)用戶執(zhí)行完一個(gè)過(guò)程后回到頁(yè)面初始。 這里有一個(gè)小技巧,就是我們?cè)?個(gè)下拉控件中已經(jīng)綁定好了內(nèi)容,但是我定義了,一個(gè)“所有類型”,也就是當(dāng)某個(gè)控件的條件為“所有類型”的時(shí)候,它就不具有任何的限制了。 代碼片段: protected void DropDownList3_DataBound(object sender, EventArgs e)
????????{
????????????ListItem item = new ListItem("所有類型", "3");
????????????DropDownList drop = (DropDownList)sender;
????????????drop.Items.Add(item);
????????} 說(shuō)明:在DataBound事件中新添加一個(gè)選項(xiàng)“所有類型”。大家“return 5.所設(shè)計(jì)到的數(shù)據(jù)庫(kù)”,看codeValue一列數(shù)據(jù),代碼中的“3”是為了區(qū)別于其他的選項(xiàng),其他兩個(gè)下拉控件,因?yàn)槭菑摹?”開(kāi)始寫入到數(shù)據(jù)庫(kù)的,所以就用“0”表示新增了。 7.綁定 private void BindProjects(int type, int typetime, int typezt)
????????{
????????????ProjectsCollection projectList = Project.GetProjects(_user.UserID, _user.Role, Convert.ToInt32(dropProjectType.SelectedValue), Convert.ToInt32(DropDownList1.SelectedValue), Convert.ToInt32(DropDownList3.SelectedValue));
????????????SortGridData(projectList, SortField, SortAscending);
ProjectsGrid.DataSource = projectList;
????????????try
????????????{
????????????????ProjectsGrid.DataBind();
????????????}
????????????catch
????????????{
????????????????ProjectsGrid.CurrentPageIndex = (ProjectsGrid.CurrentPageIndex - 1 > 0 ? ProjectsGrid.CurrentPageIndex - 1 : 0);
????????????????ProjectsGrid.DataBind();
????????????)????????
????????} 說(shuō)明:這一段代碼用到了兩個(gè)業(yè)務(wù)邏輯層的類ProjectsCollection和Project。userid和role是控制權(quán)限用的,不用管它。在綁定顯示表的時(shí)候(ProjectsGrid.DataBind()),一定要做溢出判斷,否則會(huì)出現(xiàn)BUG。 ProjectsCollection.cs代碼提供一個(gè)封裝數(shù)據(jù)的功能。那些數(shù)據(jù)就是Project.cs所用到的。 Project.cs代碼片段: public static ProjectsCollection GetProjects(int userID, string role, int type, int typetime, int typezt)
????????{
????????????DataSet ds = SqlHelper.ExecuteDataset(
????????????????ConfigurationManager.AppSettings["ConnectionString"],
????????????????"PM_ListProjectsTime", userID, Convert.ToInt32(role));
ProjectsCollection projects = new ProjectsCollection();
????????????foreach (DataRow r in ds.Tables[0].Rows)
????????????{
????????????????Project prj = new Project();
????????????????prj.ProjectType = Convert.ToInt32(r["ProjectType"]);
prj.ProjectTypeTime = Convert.ToInt32(r["ProjectTypeTime"]);
????????????????????prj.ProjectStatus = Convert.ToInt32(r["ProjectStatus"]);
????????????????????if ((type == 0 || prj.ProjectType == type) && (typetime == 0 || prj.ProjectTypeTime == typetime) && (typezt == 3 || prj.ProjectStatus == typezt))
??????????????????????? {
??????????????????????????? prj.ProjectID = Convert.ToInt32(r["ProjectID"]);??????????????????????? prj.Name = r["ProjectName"].ToString();
??????????????????????????? prj.Description = r["Description"].ToString();
??????????????????????????? prj.ProjectCode = r["ProjectCode"].ToString();
??????????????????????????? prj.ManagerUserID = Convert.ToInt32(r["ManagerUserID"]);
????????????????????????????prj.ManagerUserName = Convert.ToString(r["Username"]);
???????????????????????????? prj.EstCompletionDate = Convert.ToDateTime(r["EstCompletionDate"]);
???????????????????????????? prj.EstDuration = Convert.ToDecimal(r["EstDuration"]);
????????????????????????//prj.ProjectStatus = Convert.ToInt32(r["ProjectStatus"]);
???????????????????????????? projects.Add(prj);
?????????????????????????}
??????????????
????????????}
????????????return projects;
????????} 說(shuō)明:當(dāng)中設(shè)計(jì)到的一個(gè)數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程PM_ListProjectsTime ????????? PM_ListProjectsTime代碼入下:
CREATE?? PROCEDURE PM_ListProjectsTime
(
????@UserID int,
????@RoleID int
)
AS
IF @RoleID = 1 /*全部*/
BEGIN
????SELECT ProjectID,??
??Name as ProjectName,??
??Description,??
??ManagerUserID,??
??EmpName as UserName,
??EstCompletionDate,??
??EstDuration,
??ProjectCode,
??ProjectStatus,
??ProjectType,
??ProjectTypeTime
????FROM??
??PM_Projects
????INNER JOIN
??mrBaseInf
????ON??
??ManagerUserID = EmpID??order by ProjectName
END
ELSE IF @RoleID = 2??/*自己管的項(xiàng)目*/
BEGIN
????SELECT ProjectID,??
??Name as ProjectName,??
??Description,??
??ManagerUserID,??
??EmpName as UserName,
??EstCompletionDate,??
??EstDuration,
??ProjectCode,
??ProjectType,
??ProjectTypeTime,
??ProjectStatus
????FROM??
??PM_Projects
????INNER JOIN
??mrBaseInf
????ON??
??ManagerUserID = EmpID
????WHERE ManagerUserID = @UserID??order by ProjectName
END
GO
說(shuō)明:根據(jù)條件,獲得參數(shù),然后傳到后臺(tái),再根據(jù)頁(yè)面中綁定的Value值來(lái)綁定具體的內(nèi)容。 到現(xiàn)在也實(shí)現(xiàn)好根據(jù)條件綁定下面表的內(nèi)容了。 8.兩個(gè)控件“查詢”和“統(tǒng)計(jì)”功能的實(shí)現(xiàn)。 “查詢”功能代碼: protected void Button1_Click(object sender, EventArgs e)
{ //因?yàn)橄旅姹?ProjectsGrid)是分頁(yè)的,所以我定義每次查詢都看到的是第一頁(yè)。也就是簡(jiǎn)單的復(fù)位功能
??????????????? ProjectsGrid.CurrentPageIndex = 0;
????????????????Session["PrjType"] = Convert.ToInt32(dropProjectType.SelectedValue);
????????????????Session["PrjTypeTime"] = Convert.ToInt32(DropDownList1.SelectedValue);
????????????????Session["PrjTypeZt"] = Convert.ToInt32(DropDownList3.SelectedValue); //我在這里也做了異常處理,后面我會(huì)做解釋。這里大家可以直接理解為:BindProjects(Convert.ToInt32(dropProjectType.SelectedValue), Convert.ToInt32(DropDownList1.SelectedValue), Convert.ToInt32(DropDownList3.SelectedValue));
????????????????try
????????????????{
????????????????????BindProjects(Convert.ToInt32(dropProjectType.SelectedValue), Convert.ToInt32(DropDownList1.SelectedValue), Convert.ToInt32(DropDownList3.SelectedValue));
????????????????????????????????????}
????????????????catch
????????????????{
????????????????????ProjectsGrid.CurrentPageIndex = (ProjectsGrid.CurrentPageIndex - 1 > 0 ? ProjectsGrid.CurrentPageIndex - 1 : 0);
????????????????????BindProjects(Convert.ToInt32(dropProjectType.SelectedValue), Convert.ToInt32(DropDownList1.SelectedValue), Convert.ToInt32(DropDownList3.SelectedValue));
????????????????????????????????????}
????????????} “統(tǒng)計(jì)”按鈕也是我越到的一個(gè)麻煩,因?yàn)槲乙y(tǒng)計(jì)當(dāng)前表中數(shù)據(jù)“項(xiàng)目狀態(tài)”的情況,時(shí)間有點(diǎn)緊,我測(cè)試了很多辦法都沒(méi)有成功。 代碼片段: protected void ProjectsGrid_ItemDataBound(object sender, DataGridItemEventArgs e)
??????? { if (e.Item.ItemType == ListItemType.Item ||
????????????????????e.Item.ItemType == ListItemType.AlternatingItem)
????????????{
????????????????Label lbl = (Label)e.Item.Cells[3].Controls[1];
????????????????int status = Int32.Parse(lbl.Text);
????????????????switch (status)
????????????????{
????????????????????case 0:
????????????????????????lbl.Text = "結(jié)束";
????????????????????????lbl.BackColor = System.Drawing.Color.Gray;
??????????????????
????????????????????????break;
????????????????????case 1:
????????????????????????lbl.Text = "進(jìn)行中";
????????????????????????break;
????????????????????case -1:
????????????????????????lbl.Text = "被關(guān)閉";
????????????????????????lbl.BackColor = System.Drawing.Color.Red;
????????????????????????break;
????????????????????case -2:
????????????????????????lbl.Text = "停止";
????????????????????????lbl.BackColor = System.Drawing.Color.Red;
????????????????????????break;
????????????????}
????????????????
????????????????if (lbl.Text == "結(jié)束")
????????????????{
????????????????????m6 = m6 + 1;
????????????????????Label7.Text = "共" + m6.ToString() + "個(gè)";
????????????????}
????????????????if (lbl.Text == "進(jìn)行中")
????????????????{
????????????????????m7 = m7 + 1;
????????????????????Label8.Text = "共" + m7.ToString() + "個(gè)";
????????????????}
????????????????if (lbl.Text == "被關(guān)閉")
????????????????{
????????????????????m8 = m8 + 1;
????????????????????Label9.Text = "共" + m8.ToString() + "個(gè)";
????????????????}
????????????????if (lbl.Text == "停止")
????????????????{
????????????????????m10 = m10 + 1;
????????????????????Label10.Text = "共" + m10.ToString() + "個(gè)";
????????????????}
????????????} } 說(shuō)明:這個(gè)方法是表中的項(xiàng)被綁定時(shí)候激發(fā),表中在“項(xiàng)目狀態(tài)”那一列綁定了一個(gè)Label控件,用來(lái)顯示文字。所以在switch中根據(jù)獲取來(lái)的Value值來(lái)判斷顯示的文字和背景顏色,后面我加的這段代碼是顯示當(dāng)前頁(yè)面的各個(gè)狀態(tài)的數(shù)量,注意其實(shí)表是默認(rèn)分頁(yè)的,所以我統(tǒng)計(jì)的只能是當(dāng)前一個(gè)頁(yè)面的數(shù)據(jù)。 ??????? 我們“return “統(tǒng)計(jì)”按鈕”,我用了一個(gè)已知的辦法解決這個(gè)未知的辦法,就是當(dāng)我們點(diǎn)統(tǒng)計(jì)的時(shí)候,下面表(ProjectGrid)的ProjectsGrid.AllowPaging = false,意思是不允許分頁(yè),那么我就可以統(tǒng)計(jì)出來(lái)了,并且把右上角的“不分頁(yè)”勾上,當(dāng)我們?cè)冱c(diǎn)“查詢”和“不分頁(yè)”的時(shí)候,頁(yè)面就不會(huì)再顯示“項(xiàng)目狀態(tài)”那一行的數(shù)量了,因?yàn)槿绻环猪?yè)我感覺(jué)會(huì)數(shù)據(jù)量比較大,頁(yè)面緩沖比較慢,如果不點(diǎn)“統(tǒng)計(jì)”功能,就不要顯示統(tǒng)計(jì)功能了。當(dāng)然“統(tǒng)計(jì)”功能也要綁定數(shù)據(jù),就是也同時(shí)擁有“查詢”功能,只是不分頁(yè)顯示。 總結(jié):我想大家如果看完這篇文章肯定玉石俱焚了,如果能看一半我已經(jīng)很滿足了。在當(dāng)中我遇到兩個(gè)問(wèn)題: 1.溢出問(wèn)題,我調(diào)試了好長(zhǎng)時(shí)間,才不會(huì)出現(xiàn)漏洞。一開(kāi)始在點(diǎn)“查詢”的時(shí)候有時(shí)就出現(xiàn)BUG,頁(yè)面無(wú)相應(yīng),我加上判斷語(yǔ)句后已經(jīng)好了,但是新問(wèn)題又出現(xiàn)了,因?yàn)轫?yè)面是允許分頁(yè)的,我點(diǎn)“2”或者其他頁(yè)面后,然后再根據(jù)新條件查詢又會(huì)有漏洞,最后在DataGrid分頁(yè)時(shí)間中有這兩句:ProjectsGrid.CurrentPageIndex = e.NewPageIndex;Session["PM_ListIndex"] = e.NewPageIndex;我把Session["PM_ListIndex"] = e.NewPageIndex;去掉就不會(huì)再有BUG了,我也不知道原因,希望高人能指點(diǎn):-) 2.我一開(kāi)始想讓頁(yè)面即使允許分頁(yè)也能把全部的數(shù)據(jù)都統(tǒng)計(jì)出來(lái),我試了很多方法,還是沒(méi)試出來(lái),希望能有高人指點(diǎn),現(xiàn)在把全部數(shù)據(jù)堆到一個(gè)頁(yè)面點(diǎn)“統(tǒng)計(jì)”我感覺(jué)會(huì)有一點(diǎn)慢。 我知道我自己?jiǎn)锇肃碌膶懩敲炊嗪苌贂?huì)有耐心能看完,但是我覺(jué)得我該完這個(gè)東西我收獲很大,所以我希望跟大家分享,我還比較菜,希望大家多多指點(diǎn)。 信心和努力伴隨著我們,讓我們一起眺望遠(yuǎn)方,即使遠(yuǎn)方很遠(yuǎn)~~
轉(zhuǎn)載于:https://blog.51cto.com/mixangel/55806
總結(jié)
以上是生活随笔為你收集整理的用“已知”的办法解决“未知”的办法---.NET连动控件和统计数量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 赠李哲(帮别人名字作诗)
- 下一篇: XML与JavaBean相互转换工具