什么是GridView控件?这段是来自百度百笠的:GridView 是 DataGrid的后继控件,在.net framework 2 中,虽然还存在DataGrid,但是GridView已经走上了历史的前台,取代DataGrid的趋势已是势不可挡。GridView和DataGrid功能相似,都是在web页面中显示数据源中的数据,将数据源中的一行数据,也就是一条记录,显示为在web页面上输出表格中的一行。
数据来源自一个XML文件,如果我们不知道如何操作XML数据,文章后面我们会补充。
1.XML内容如下:
Â
   AK-47
   ä¿ç½æ¯
   30
   0.2
   300M
Â
Â
   AWM
   è±å½
   10
   1
   1000M
Â
Â
   MP5
   ç¾å½
   80
   0.1
   280M
Â
Â
   æ°é¤
   德å½
   10
   0.2
   120M
Â
(è¿éçæ°ææºè¿å¯ä»¥ä»æ°æåºä¸è¯»åï¼æ¯å¦âselect uid,uname,usex,uage from usersâ...è¿æ ·å°±å¯ä»¥ä¸ç¨XMLäº)
Â
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; }
   }
3.前台界面如下:
上面的文本框从左到右分别是TextBox1-TextBox7,编号是用来作为主键的因此不可编辑,3个按钮亦是Button1-Button3,GridView1是当前数据控件;
4.GridView设计
①从工具箱拖一个控件到web页面
②点击控件右上角的小三角按钮,然后点击“编辑列”
③在弹出窗口中分别添加若干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("</p><script>alert('请填写要添加数据')</script><p>");
return;
}
OperationXML("create", "");
ClearControl();//清空文本框
}
//修改
protected void Button3_Click(object sender, EventArgs e)
{
if (TextBox1.Text.Trim() == "") //编号必须存在
{
Response.Write("</p><script>alert('请在要修改的行上点击“编辑”后重试!')</script><p>");
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();//清空文本框
}
///
/// 清空控件值
///
private void ClearControl()
{
TextBox1.Text = TextBox2.Text = TextBox3.Text = TextBox4.Text = TextBox5.Text = TextBox6.Text = TextBox7.Text = "";
}
///
/// 操作XML类的公共方法
Response.Write("<script>alert('"++"')</script>"); ///
///操作类型名称,select/create/update/delete
///操作参数,这里传入的是主键gunid
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
gunList = new List();//定义一个枪的集合
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
///
/// 获取xml文件路径
///
///
private string GetXMLPath()
{
string xmlPath = Server.MapPath("Gun.xml");
return xmlPath;
}
///
/// 保存XML文件
///
///xml文件名称
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", "");//绑定数据源
}
}
}
C#操作XML文档实例教程
XML文档是一种通用的文档,这种文档既可以用.config作为后缀也可以用.xml作为后缀。XML文档主要由元素节点和节点的属性共同构成的。它有且仅有一个根节点,其他的节点全部都是根节点的子节点或者子子节点;每一个节点有开始就一定会有结束,不可能出现有开始无结束的节点,节点主要有两种类型:有InnerText的……和没有InnerText的。在节点中含有属性,一个节点可以含有多个属性,每个属性是由名字和值共同构成的。
在XML文档中,节点、属性都是区分大小写的。对于某个节点的属性,Name是不能重复的,即使在定义属性的时候,定义了两个name完全相同的属性,添加到同一个节点上面,后面的属性会把前面的属性覆盖,不会报语法错误;对于某个节点下面的子节点,则可以添加多个完全相同的子节点。
对XML文档的操作的前提是:XML文档已经存在,并且根节点已经存在。
一、添加节点和属性
1、定义一个XML的操作对象:
XmlDocument doc = new XmlDocument();
2、加载一个XML文件:
doc.Load(@"D:\App.config");
指定的文件一定要存在,否则会报错的。
3、获取根节点:
XmlNode root = doc.DocumentElement;
4、定义一个属性:
XmlAttribute ra = doc.CreateAttribute("Name");
5、给属性的值赋值:
ra.Value = "zwj2";
6、将属性添加到节点上面:
root.Attributes.Append(ra);
7、再定义一个节点为根节点的子节点:
XmlNode root1 = doc.CreateElement("table");
8、给节点赋文本值:
root1.InnerText = "sdf1";
9、给节点定义并添加属性
10、将该节点添加到父节点上去:
root.AppendChild(root1);
11、保存XML文档:
doc.Save(@"D:\App.config");
注意:可以对一个节点添加多个属性,那么各个属性会依次往后排;可以给根节点添加多个子节点,也可以对子节点再添加多个子节点。
二、查询和修改节点和属性
1、元素结点有Name属性,就是<>里面的串,也有InnerText属性(相当于文本结点),就是<></>之间的串:root.Name、root.InnerText。这些属性都是可以读写的。------------------------------XmlNode
2、属性结点有Name,也有Value:providerName="System.Data.SqlClient",前面为Name,后面为Value这些属性既可读也可写。-----------------------------------------------------------XmlAttribute
3、每一个结点有子结点的集合,也有属性的集合:root.ChildNodes、root.Attributes;集合都有count属性。
4、集合都满足索引:
对于属性集合,属性的name是不能重复的,所以索引可以是name字符串索引,那么name字符串要存在,否则返回的是一个null属性对象,不会报错;也可以是整数索引,那么此时的整数不能越界,否则是会报错的;:root.Attributes["name"]、root.Attributes[0],返回XmlAttribute。
对于子节点的集合,因为子节点可以完全相同,那么子节点的name肯定也可以相同,所以此时的索引只能是整数的,而不能是子节点name字符串,整数索引也不能越界,否则会报错: root.ChildNodes[10],返回XmlNode。
三、几个重要的函数
1、XmlNode XmlDocument.SelectSingleNode(@"configuration/twoNode/dayStart")
这个函数是用一个声明好的并且已经成功加载了某个配置文件的XmlDocument对象去调用SelectSingleNode函数;该函数的参数是配置文件中的从根节点名字开始一直往下最终到想要的节点的名字,整个名字路径都不能出错,注意是左斜杠;函数的返回值是第一次找到的XmlNode节点的对象,如果找不到就会返回null。
操作如下xml:
<?xmlversion="1.0"?>
<configuration>
<twoNode>
</twoNode>
<twoNode>
<dayStart>1</dayStart>
<dayStart>2</dayStart>
<dayStart>3</dayStart>
</twoNode>
</configuration>
如果执行该函数,那么将会找到节点:<dayStart>1</dayStart>
2、XmlNodeList XmlDocument.SelectNodes (@"configuration/twoNode/dayStart")
这个函数是用一个声明好的并且已经成功加载了某个配置文件的XmlDocument对象去调用SelectNodes函数;该函数的参数是配置文件中的从根节点名字开始一直往下最终到想要的节点的名字,整个名字路径都不能出错,注意是左斜杠;因为节点的名字是可能重复的,所以函数的返回值是找到的所有XmlNode节点对象的集合XmlNodeList,如果找不到就会返回null。
XmlNodeList是集合,那么就有count属性,可以直接对这个集合用[int index]来索引具体的对象,也可以用集合的Item(int index)函数来索引具体的对象,但是索引不能越界,否则会出错,返回的是XmlNode。
操作如下xml:
<?xmlversion="1.0"?>
<configuration>
<twoNode>
<dayStart>-1</dayStart>
<dayStart>-2</dayStart>
<dayStart>-3</dayStart>
</twoNode>
<twoNode>
<dayStart>1</dayStart>
<dayStart>2</dayStart>
<dayStart>3</dayStart>
</twoNode>
</configuration>
如果执行该函数,那么将会找到节点集合:
<dayStart>-1</dayStart>
<dayStart>-2</dayStart>
<dayStart>-3</dayStart>
<dayStart>1</dayStart>
<dayStart>2</dayStart>
<dayStart>3</dayStart>
操作如下xml:
<?xmlversion="1.0"?>
<configuration>
<twoNode>
</twoNode>
<twoNode>
<dayStart>1</dayStart>
<dayStart>2</dayStart>
<dayStart>3</dayStart>
</twoNode>
</configuration>
如果执行该函数,那么将会找到节点集合:
<dayStart>1</dayStart>
<dayStart>2</dayStart>
<dayStart>3</dayStart>
下面就开始进行实际操作吧!
一.添加一个xml文件,名为book.xml ,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
<book Type="必修课" ISBN="7-111-19149-2">
<title>数据结构</title>
<author>严蔚敏</author>
<price>30.00</price>
</book>
<book Type="必修课" ISBN="7-111-19149-3">
<title>路由型与交换型互联网基础</title>
<author>程庆梅</author>
<price>27.00</price>
</book>
<book Type="必修课" ISBN="7-111-19149-4">
<title>计算机硬件技术基础</title>
<author>李继灿</author>
<price>25.00</price>
</book>
<book Type="必修课" ISBN="7-111-19149-5">
<title>软件质量保证与管理</title>
<author>朱少民</author>
<price>39.00</price>
</book>
<book Type="必修课" ISBN="7-111-19149-6">
<title>算法设计与分析</title>
<author>王红梅</author>
<price>23.00</price>
</book>
<book Type="选修课" ISBN="7-111-19149-1">
<title>计算机操作系统</title>
<author>你猜</author>
<price>28</price>
</book>
</bookstore>……>
二.添加一个web页面,名为 XML_Operation.aspx,页面内容如下:
一共4个按钮,分别是button1、button2、button3、button4,然后是一个GridView1用来显示数据
……>
三.添加一个BookModel.cs类用于读取数据,内容如下:
public class BookModel
{
//构造函数
public BookModel(){}
///
/// 所对应的课程类型
///
public string BookType { get; set; }
///
/// 书所对应的ISBN号
///
public string BookISBN { get; set; }
///
/// 书名
///
public string BookName { get; set; }
///
/// 作者
///
public string BookAuthor { get; set; }
///
/// 价格
///
public string BookPrice { get; set; }
}
四.后台代码如下:
1.添加命名空间 using System.Xml;
2.添加公共方法,用于操作当前XML
另外,如果想获取XML相对路径,可以这样做,首先引用命名空间using System.IO; 然后直接 stirng xmlPath = Server.MapPath("Gun.xml") 即可。
3.各个调用事件如下:
//查询节点
protected void Button1_Click(object sender, EventArgs e)
{
OperationXML("select");
}
//新增节点
protected void Button2_Click(object sender, EventArgs e)
{
OperationXML("create");
}
//修改节点
protected void Button3_Click(object sender, EventArgs e)
{
OperationXML("update");
}
//删除节点
protected void Button4_Click(object sender, EventArgs e)
{
OperationXML("delete");
}