C#操做GridView控件

GridView控件是一個visualStudio自帶的數據控件,它能夠很是快速的將數據以表格方式顯示在web頁面上。下面就是一個利用GridView控件進行數據綁定的小例子,內容以下:html

數據來源自一個XML文件,至於如何操做XML文件,這裏不做詳細描述,具體能夠參考 http://www.cnblogs.com/programsky/p/3816073.htmlweb

1.XML內容以下:數據庫

<?xml version="1.0" encoding="utf-8"?>
<gunbook>
  <gun type="自動步槍" gid="001">
    <name>AK-47</name>
    <from>俄羅斯</from>
    <clip>30</clip>
    <accurate>0.2</accurate>
    <range>300M</range>
  </gun>
  <gun type="狙擊槍" gid="002">
    <name>AWM</name>
    <from>英國</from>
    <clip>10</clip>
    <accurate>1</accurate>
    <range>1000M</range>
  </gun>
  <gun type="衝鋒槍" gid="003">
    <name>MP5</name>
    <from>美國</from>
    <clip>80</clip>
    <accurate>0.1</accurate>
    <range>280M</range>
  </gun>
  <gun type="霰彈槍" gid="004">
    <name>氣錘</name>
    <from>德國</from>
    <clip>10</clip>
    <accurate>0.2</accurate>
    <range>120M</range>
  </gun>
</gunbook>
View Code

(這裏的數據源還能夠從數據庫中讀取,好比「select uid,uname,usex,uage from users」...這樣就能夠不用XML了)ide

 

2.定義了一個model類便於數據交換:工具

 //定義一個槍的數據模型類
    public class GunModel
    {
        public GunModel() { }
        //槍的名稱
        public string GunName { get; set; }
        //槍的類型
        public string GunType { get; set; }
        //槍的編號
        public string GunID { get; set; }
        //槍的產地
        public string GunFrom { get; set; }
        //槍的彈夾
        public string GunClip { get; set; }
        //槍的精準度
        public string GunAccurate { get; set; }
        //槍的射程
        public string GunRange { get; set; }
    }
View Code

 

3.前臺界面以下:ui

上面的文本框從左到右分別是TextBox1-TextBox7,編號是用來做爲主鍵的所以不可編輯,3個按鈕亦是Button1-Button3,GridView1是當前數據控件;spa

 

4.GridView設計設計

①從工具箱拖一個控件到web頁面3d

②點擊控件右上角的小三角按鈕,而後點擊「編輯列」code

③在彈出窗口中分別添加若干BoundFiled控件和一個TemplateField控件,並去掉窗口左下角的「自動生成字段」即不勾選;

注意,具體設置是——選中 BoundFiled 點擊「添加」,而後在右邊填寫數據中的DataField(數據源中的列名,例如當前的編號GunID)、外觀中的HeaderText(要顯示在頁面上的列名,例如當前的「編號」),

TemplateField只須要填寫HeaderText便可,而後取消「自動生成字段」的勾選框,最後點擊「肯定」;

④點擊「自動套用格式」能夠根據須要設置相應的樣式,點擊「編輯模板」進行操做中的模板設置

拖兩個LinkButton,分別起名稱 編輯 、 刪除 (LinkButton屬性Font-->UnderLine選擇False能夠去掉下劃線,不過要選2下才能啓用此操做)

⑤編輯後界面以下

⑥進行前臺界面的相關設置

注意:CommandArgument能夠綁定當前控件上的相應值,通常咱們都是綁定主鍵列的值,例如這裏的GunID(不分區大小寫);CommandName是爲了方便後臺經過GridView的RowCommand事件找到當前操做的類型,好比編輯或是刪除,注意起名字一定要避免關鍵字,如"edit"、"update"、"delete",能夠起"upd"、"del"等;OnClientClick通常用於前臺的彈框事件,好比這裏的刪除提示。

 另外,控件的屬性AllowPaging=true  能夠進行分頁,而PageSize屬性能夠設置分頁大小,即每頁顯示的數量。

 

5.後臺代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Xml;
using System.IO;

namespace AboutXML
{
    public partial class Gun : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            TextBox1.Enabled = true;
            if (!Page.IsPostBack) 
            {
                OperationXML("select", "");
            }
        }        
        
        //查詢
        protected void Button1_Click(object sender, EventArgs e)
        {
            OperationXML("select", "");
        }

        //添加
        protected void Button2_Click(object sender, EventArgs e)
        {
            //在後臺改變控件的樣式
            //Button2.Attributes.Add("style", "background-color:red;");//這是方式1,按照Css的樣式進行改變
            //Button2.Style.Add("Color", "blue");//這是方式2,按照控件自帶屬性進行改變

            if (TextBox1.Text.Trim() == "") //編號必須存在
            {
                Response.Write("<script>alert('請填寫要添加數據')</script>");
                return;
            }
            OperationXML("create", "");
            ClearControl();//清空文本框
        }

        //修改
        protected void Button3_Click(object sender, EventArgs e)
        {
            if (TextBox1.Text.Trim() == "") //編號必須存在
            {
                Response.Write("<script>alert('請在要修改的行上點擊「編輯」後重試!')</script>");
                return;
            }

            XmlDocument xmldoc = new XmlDocument();//添加一個xml文檔對象
            xmldoc.Load(GetXMLPath());//加載文檔

            XmlNode gunroot = xmldoc.SelectSingleNode("gunbook");//獲取根節點
            string conditionPath = "/gunbook/gun[@gid=\"" + TextBox1.Text + "\"]";//XML獲取節點的條件,格式固定,若是想要添加屬性還能夠用「and @屬性=屬性值」 操做
            XmlNode updateNode = xmldoc.SelectSingleNode(conditionPath);//根據條件獲取一個節點

            if (updateNode != null && updateNode.ChildNodes != null && updateNode.ChildNodes.Count == 5)
            {
                updateNode.ChildNodes.Item(0).InnerText = TextBox2.Text;//名稱
                updateNode.Attributes.GetNamedItem("type").InnerText = TextBox3.Text;//類型
                updateNode.ChildNodes.Item(1).InnerText = TextBox4.Text;//產地
                updateNode.ChildNodes.Item(2).InnerText = TextBox5.Text;//彈夾
                updateNode.ChildNodes.Item(3).InnerText = TextBox6.Text;//精準
                updateNode.ChildNodes.Item(4).InnerText = TextBox7.Text;//射程
            }

            SaveXML(xmldoc);//保存文件並刷新當前頁面

            ClearControl();//清空文本框
        }

        /// <summary>
        /// 清空控件值
        /// </summary>
        private void ClearControl() 
        {
            TextBox1.Text = TextBox2.Text = TextBox3.Text = TextBox4.Text = TextBox5.Text = TextBox6.Text = TextBox7.Text = "";
        }

        /// <summary>
        /// 操做XML類的公共方法 Response.Write("<script>alert('"++"')</script>");
        /// </summary>
        /// <param name="opname">操做類型名稱,select/create/update/delete</param>
        /// <param name="commandAugument">操做參數,這裏傳入的是主鍵gunid</param>
        private void OperationXML(string opname,string commandAugument) 
        {
            XmlDocument xmldoc = new XmlDocument();//添加一個xml文檔對象
            xmldoc.Load(GetXMLPath());//加載文檔

            XmlNode gunroot = xmldoc.SelectSingleNode("gunbook");//獲取根節點

            switch (opname) 
            {
                case "select"://查詢
                    #region

                    List<GunModel> gunList = new List<GunModel>();//定義一個槍的集合
                    if (gunroot != null && gunroot.ChildNodes.Count > 0)
                    {
                        XmlNodeList childList;
                        foreach (XmlNode child in gunroot.ChildNodes)//循環全部子節點
                        {
                            //第一種,直接經過XmlNode獲取屬性值
                            string type = child.Attributes.GetNamedItem("type").InnerText;
                            string id = child.Attributes.GetNamedItem("gid").InnerText;

                            //第二種,經過XmlElement獲取屬性值
                            //XmlElement xmlatt = (XmlElement)child;
                            //string type = xmlatt.GetAttribute("type");
                            //string id = xmlatt.GetAttribute("gid");

                            GunModel gunmodel = new GunModel();
                            gunmodel.GunType = type;
                            gunmodel.GunID = id;

                            childList = child.ChildNodes;
                            if (childList != null && childList.Count == 5)
                            {
                                gunmodel.GunName = childList.Item(0).InnerText;//名稱
                                gunmodel.GunFrom = childList.Item(1).InnerText;//產地
                                gunmodel.GunClip = childList.Item(2).InnerText;//彈夾
                                gunmodel.GunAccurate = childList.Item(3).InnerText;//精準
                                gunmodel.GunRange = childList.Item(4).InnerText;//射程
                            }
                            else 
                            {
                                gunmodel.GunName = "no data";
                                gunmodel.GunFrom = "no data";
                                gunmodel.GunClip = "no data";
                                gunmodel.GunAccurate = "no data";
                                gunmodel.GunRange = "no data";
                            }

                            gunList.Add(gunmodel);//將槍對象添加到槍集合中
                        }//foreach (XmlNode child in gunroot.ChildNodes) end

                        GridView1.DataSource = gunList;//綁定數據源
                        GridView1.DataBind();

                    }//if (gunroot != null && gunroot.ChildNodes.Count > 0) end

                #endregion
                    break;

                case "create"://增長
                    #region

                    XmlElement createElement = xmldoc.CreateElement("gun");//建立一個槍的節點元素
                    createElement.SetAttribute("type", TextBox3.Text);//類型
                    createElement.SetAttribute("gid", TextBox1.Text);//編號
                    XmlNode createNode = (XmlNode)createElement;
                    gunroot.AppendChild(createNode);//

                    XmlElement createElementChildName = xmldoc.CreateElement("name");//名稱
                    createElementChildName.InnerText = TextBox2.Text;//
                    createElement.AppendChild(createElementChildName);

                     XmlElement createElementChildFrom = xmldoc.CreateElement("from");//產地
                    createElementChildFrom.InnerText = TextBox4.Text;//
                    createElement.AppendChild(createElementChildFrom);

                     XmlElement createElementChildClip = xmldoc.CreateElement("clip");//彈夾
                    createElementChildClip.InnerText = TextBox5.Text;//
                    createElement.AppendChild(createElementChildClip);

                     XmlElement createElementChildAccurate = xmldoc.CreateElement("accurate");//精準
                    createElementChildAccurate.InnerText = TextBox6.Text;//
                    createElement.AppendChild(createElementChildAccurate);

                     XmlElement createElementChildRange = xmldoc.CreateElement("range");//射程
                    createElementChildRange.InnerText = TextBox7.Text;//
                    createElement.AppendChild(createElementChildRange);

                    SaveXML(xmldoc);//保存文件並刷新當前頁面

                    #endregion
                    break;

                case "update"://修改
                    #region

                    string conditionPath = "/gunbook/gun[@gid=\"" + commandAugument + "\"]";//XML獲取節點的條件,格式固定,若是想要添加屬性還能夠用「and @屬性=屬性值」 操做
                    XmlNode updateNode = xmldoc.SelectSingleNode(conditionPath);//根據條件獲取一個節點
                    TextBox1.Text = commandAugument;//編號
                    if (updateNode != null && updateNode.ChildNodes != null && updateNode.ChildNodes.Count == 5)
                    {
                        TextBox2.Text = updateNode.ChildNodes.Item(0).InnerText;//名稱
                        TextBox3.Text = updateNode.Attributes.GetNamedItem("type").InnerText;//類型
                        TextBox4.Text = updateNode.ChildNodes.Item(1).InnerText;//產地
                        TextBox5.Text = updateNode.ChildNodes.Item(2).InnerText;//彈夾
                        TextBox6.Text = updateNode.ChildNodes.Item(3).InnerText;//精準
                        TextBox7.Text = updateNode.ChildNodes.Item(4).InnerText;//射程
                    }
                    else 
                    {
                        TextBox2.Text = "";
                        TextBox3.Text = "";
                        TextBox4.Text = "";
                        TextBox5.Text = "";
                        TextBox6.Text = "";
                        TextBox7.Text = "";
                    }

                    #endregion
                    break;

                default://刪除
                    #region

                    string conditionPath2 = "/gunbook/gun[@gid=\"" + commandAugument + "\"]";//XML獲取節點的條件,格式固定,若是想要添加屬性還能夠用「and @屬性=屬性值」 操做
                    XmlNode deleteNode = xmldoc.SelectSingleNode(conditionPath2);//根據條件獲取一個節點

                    if (deleteNode != null) 
                    {
                        deleteNode.ParentNode.RemoveChild(deleteNode);//移除當前節點
                    }

                    SaveXML(xmldoc);//保存文件並刷新當前頁面

                    #endregion
                    break;
            }

            
        }//function end

        /// <summary>
        /// 獲取xml文件路徑
        /// </summary>
        /// <returns></returns>
        private string GetXMLPath() 
        {
            string xmlPath = Server.MapPath("Gun.xml");
            return xmlPath;
        }

        /// <summary>
        /// 保存XML文件
        /// </summary>
        /// <param name="xmldoc">xml文件名稱</param>
        private void SaveXML(XmlDocument xmldoc) 
        {
            xmldoc.Save(GetXMLPath());
            OperationXML("select", "");//刷新頁面
        }

        protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "upd")//編輯
            {
                TextBox1.Enabled = false;//編號不能編輯,不然失去主鍵意義
                string guid = e.CommandArgument.ToString();

                OperationXML("update", e.CommandArgument.ToString());

                //GridViewRow gvr = (GridViewRow)(((LinkButton)(e.CommandSource)).Parent.Parent);//當前控件所在行
                //int j = gvr.RowIndex;//當前控件所在行的 Index,即行的位置
            }
            else //del,刪除
            {
                OperationXML("delete",e.CommandArgument.ToString());
            }
        }

        //分頁
        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridView1.PageIndex = e.NewPageIndex;
            OperationXML("select", "");//綁定數據源
        }
      
    }
}
View Code

固然,這裏的查詢還能夠按照條件來,只不過我這裏沒有實現,有興趣能夠本身試試。

相關文章
相關標籤/搜索