日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

用“已知”的办法解决“未知”的办法---.NET连动控件和统计数量

發布時間:2024/4/11 asp.net 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用“已知”的办法解决“未知”的办法---.NET连动控件和统计数量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
好幾天沒更新博客了,這幾天都忙著修改代碼。我老大(豪客)給我的任務還是比較重的,o(∩_∩)o...哈哈,今天就跟大家聊一下這幾天的收獲。希望能跟大家一起分享。 首先以前頁面的截圖如下: 更新后的截圖如下: 更新2個”查詢“限制條件,以便能查詢下面表中更詳細的內容,還有一個“統計”按鈕,統計當前條件下表中的“項目狀態”為“結束”、“進行中”、“被關閉”、“停止”的項目分別有多少個。 我用“項目狀態”的下拉控件舉例,“完成日期”、“項目類型”和它實現差不多。 1.頁面代碼: <asp:DropDownList ID="DropDownList3" runat="server" DataSource="<%# ProjectZt %>"?? DataTextField="codeText" DataValueField="codeValue" OnDataBound="DropDownList3_DataBound">
????????????????????????????????</asp:DropDownList> 說明:在頁面的Table中增加一個dropdownlist控件。當中的參數在大家耐心慢慢看下去就知道是什么意思了。 2.后臺代碼片段: public DataTable ProjectZt
????????{
????????????get
????????????{
????????????????return (new CommonBLL()).GetZt_new("projectStatusType");
????????????}
????????} 說明:頁面中的DataSource綁定的數據在后臺中實現。并且調用業務邏輯層(BLL)的類CommonBLL。 3.業務邏輯層中CommonBLL的代碼片段: public DataTable GetZt_new(string type)
????????{
????????????DataTable table;

????????????table = CommonDA.GetCodeList3(type).Tables[0];

????????????return table;
????????} 說明:程序繼續調用數據邏輯層(DAL),并且返回table。 4.數據訪問層中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;
????????} 說明:這一層開始調用數據庫中的表,并且獲取數據。沒什么太難的,都是固定語句,只是一步一步的調用,當然直接從后臺文件里直接調用這一層也可以,或者直接寫入后臺都可以。這樣寫的代碼清晰性會好一些。 5.所設計到的數據庫:(兩個表) 說明:數據訪問層中的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 + "')"就是調用數據庫的方法,當然也可以寫到數據庫存儲過程中,直接調用存儲過程訪問數據庫。 大家可能已經都注意到了。數據庫中有兩個頁面中出現的參數codeValue和codeText,讓我們“return 1.頁面代碼”,這兩個就綁定在控件中DataValueField和DataTextField中,DataTextField就是我們看到綁定的內容。 到這里控件的內容我們綁定好了,下面我們就要實現當我們選中當中的內容時,點“查詢”或者“統計”按鈕,下面顯示的表(DataGrid控件)重新綁定我們規定條件的數據。 6.讓我們“return 2.后臺代碼”: 實現完控件的綁定,下面就是Page_Load中的代碼,這里面的代碼意思是,當頁面加載的時候所實現的功能,即用戶向服務端每提交一次請求就加載當中的命令。當中有個很重要的語句If(!IsPostBack),意思是當頁面是用戶第一次加載的時候要執行的命令。這里有熟悉的朋友也有不熟悉的朋友,所以我盡量用簡短的話來描述一下,如果還不是太清楚就試一試有無這個命令If(!IsPostBack)時的效果。 代碼片段: if (!IsPostBack)
????????????{

????????????????CheckBox1.Checked = false;
???????????????? //“不分頁”控件是實現下面顯示表(DataGrid)是否分頁要求的。在頁面第一次加載默認是分頁的


????????????????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); //根據目前3個條件綁定數據
Session["PrjType"] = null;
????????????????Session["PrjTypeTime"] = null;
????????????????Session["PrjTypeZt"] = null;
????????????}
????????????else
????????????{ //頁面繼承了一個基類PageBase,當中已經封裝好了方法和類。
????????????????prjType = SessionGetInt("PrjType");
????????????????prjTypeTime = SessionGetInt("PrjTypeTime");
????????????????prjTypeZt = SessionGetInt("PrjTypeZt");
????????????}
說明:頁面綁定3個限制條件控件的初始值,根據目前的條件進行加載。其他的參數設置頁面的默認屬性,以便當用戶執行完一個過程后回到頁面初始。 這里有一個小技巧,就是我們在3個下拉控件中已經綁定好了內容,但是我定義了,一個“所有類型”,也就是當某個控件的條件為“所有類型”的時候,它就不具有任何的限制了。 代碼片段: protected void DropDownList3_DataBound(object sender, EventArgs e)
????????{
????????????ListItem item = new ListItem("所有類型", "3");
????????????DropDownList drop = (DropDownList)sender;
????????????drop.Items.Add(item);
????????} 說明:在DataBound事件中新添加一個選項“所有類型”。大家“return 5.所設計到的數據庫”,看codeValue一列數據,代碼中的“3”是為了區別于其他的選項,其他兩個下拉控件,因為是從“1”開始寫入到數據庫的,所以就用“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();
????????????)????????
????????} 說明:這一段代碼用到了兩個業務邏輯層的類ProjectsCollection和Project。userid和role是控制權限用的,不用管它。在綁定顯示表的時候(ProjectsGrid.DataBind()),一定要做溢出判斷,否則會出現BUG。 ProjectsCollection.cs代碼提供一個封裝數據的功能。那些數據就是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;
????????} 說明:當中設計到的一個數據庫存儲過程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??/*自己管的項目*/
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
說明:根據條件,獲得參數,然后傳到后臺,再根據頁面中綁定的Value值來綁定具體的內容。 到現在也實現好根據條件綁定下面表的內容了。 8.兩個控件“查詢”和“統計”功能的實現。 “查詢”功能代碼: protected void Button1_Click(object sender, EventArgs e)
{ //因為下面表(ProjectsGrid)是分頁的,所以我定義每次查詢都看到的是第一頁。也就是簡單的復位功能
??????????????? ProjectsGrid.CurrentPageIndex = 0;
????????????????Session["PrjType"] = Convert.ToInt32(dropProjectType.SelectedValue);

????????????????Session["PrjTypeTime"] = Convert.ToInt32(DropDownList1.SelectedValue);

????????????????Session["PrjTypeZt"] = Convert.ToInt32(DropDownList3.SelectedValue); //我在這里也做了異常處理,后面我會做解釋。這里大家可以直接理解為: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));
????????????????????????????????????}
????????????} “統計”按鈕也是我越到的一個麻煩,因為我要統計當前表中數據“項目狀態”的情況,時間有點緊,我測試了很多辦法都沒有成功。 代碼片段: 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 = "結束";
????????????????????????lbl.BackColor = System.Drawing.Color.Gray;
??????????????????
????????????????????????break;
????????????????????case 1:
????????????????????????lbl.Text = "進行中";

????????????????????????break;
????????????????????case -1:
????????????????????????lbl.Text = "被關閉";
????????????????????????lbl.BackColor = System.Drawing.Color.Red;

????????????????????????break;
????????????????????case -2:
????????????????????????lbl.Text = "停止";
????????????????????????lbl.BackColor = System.Drawing.Color.Red;

????????????????????????break;

????????????????}
????????????????
????????????????if (lbl.Text == "結束")
????????????????{

????????????????????m6 = m6 + 1;
????????????????????Label7.Text = "共" + m6.ToString() + "個";

????????????????}
????????????????if (lbl.Text == "進行中")
????????????????{
????????????????????m7 = m7 + 1;
????????????????????Label8.Text = "共" + m7.ToString() + "個";

????????????????}
????????????????if (lbl.Text == "被關閉")
????????????????{
????????????????????m8 = m8 + 1;
????????????????????Label9.Text = "共" + m8.ToString() + "個";

????????????????}
????????????????if (lbl.Text == "停止")
????????????????{
????????????????????m10 = m10 + 1;
????????????????????Label10.Text = "共" + m10.ToString() + "個";

????????????????}
????????????} } 說明:這個方法是表中的項被綁定時候激發,表中在“項目狀態”那一列綁定了一個Label控件,用來顯示文字。所以在switch中根據獲取來的Value值來判斷顯示的文字和背景顏色,后面我加的這段代碼是顯示當前頁面的各個狀態的數量,注意其實表是默認分頁的,所以我統計的只能是當前一個頁面的數據。 ??????? 我們“return “統計”按鈕”,我用了一個已知的辦法解決這個未知的辦法,就是當我們點統計的時候,下面表(ProjectGrid)的ProjectsGrid.AllowPaging = false,意思是不允許分頁,那么我就可以統計出來了,并且把右上角的“不分頁”勾上,當我們再點“查詢”和“不分頁”的時候,頁面就不會再顯示“項目狀態”那一行的數量了,因為如果不分頁我感覺會數據量比較大,頁面緩沖比較慢,如果不點“統計”功能,就不要顯示統計功能了。當然“統計”功能也要綁定數據,就是也同時擁有“查詢”功能,只是不分頁顯示。 總結:我想大家如果看完這篇文章肯定玉石俱焚了,如果能看一半我已經很滿足了。在當中我遇到兩個問題: 1.溢出問題,我調試了好長時間,才不會出現漏洞。一開始在點“查詢”的時候有時就出現BUG,頁面無相應,我加上判斷語句后已經好了,但是新問題又出現了,因為頁面是允許分頁的,我點“2”或者其他頁面后,然后再根據新條件查詢又會有漏洞,最后在DataGrid分頁時間中有這兩句:ProjectsGrid.CurrentPageIndex = e.NewPageIndex;Session["PM_ListIndex"] = e.NewPageIndex;我把Session["PM_ListIndex"] = e.NewPageIndex;去掉就不會再有BUG了,我也不知道原因,希望高人能指點:-) 2.我一開始想讓頁面即使允許分頁也能把全部的數據都統計出來,我試了很多方法,還是沒試出來,希望能有高人指點,現在把全部數據堆到一個頁面點“統計”我感覺會有一點慢。 我知道我自己啰里八嗦的寫那么多很少會有耐心能看完,但是我覺得我該完這個東西我收獲很大,所以我希望跟大家分享,我還比較菜,希望大家多多指點。 信心和努力伴隨著我們,讓我們一起眺望遠方,即使遠方很遠~~

轉載于:https://blog.51cto.com/mixangel/55806

總結

以上是生活随笔為你收集整理的用“已知”的办法解决“未知”的办法---.NET连动控件和统计数量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。