首页 > 代码库 > GridView控件相关
GridView控件相关
---恢复内容开始---
GridView控件的【AutoGenerateColumns】属性(bool类型)的意思是----运行时是否基于关联的数据源自动生成列。
这样造成的影响是列的标题自动生成无法进行修改。
想手工的控制列名,则需把这个属性设为False。然后再控件的右上角点击,出现【编辑列】,或者在属性页面设置【Columns】属性,都会弹出编辑列的界面:
(1).【BoundField】----绑定以文本形式显示一个字段。它的属性:
HeaderText----就是显示的列名,
DataField-----绑定的实体字段(TypeName),DataFormatString----设定绑定值的格式设置 例如---名称:{0}---就表示显示的值为----名称:房间类型
(2).【CheckBoxField】----绑定以是否选中的形式显示一个Bool字段。它的属性:
HeaderText----就是显示的列名,
DataField-----绑定的实体字段(Bool类型-AddBed)。
(3).【HyperLinkField】----绑定以超链接的形式显示一个字段。它的属性:
HeaderText----就是显示的列名。
Text-----设置超链接的文本属性。假如每一行的显示文本都一样("详细"),则只需要设置Text属性即可。
DataTextField 和 DataTextFormateString----设置超链接的文本属性。相比上面:这是对于每一行各自显示时所使用的。第一个属性是绑定到超链接文本属性的字段(TypeName),第二个属性是设置绑定到超链接的文本属性的字段应用的格式。
DataNavigateUrlField 和 DataNavigateUrlFormateString-----设置超链接的Url属性。第一个属性是绑定到超链接的Url属性的字段(TypeId),第二个属性是对绑定到超链接Url属性的值应用的格式进行设置----例如----Show.aspx?typeid={0}
(4).【ImageField】----绑定以图片的形式显示一个字段(允许加床则为对号图片)。它的属性:
HeaderText----就是显示的列名。
DataImageUrlField---图像Url绑定到的字段(AddBed),DataImageUrlFormateString对绑定到图像的ImageUrl属性的值应用的格式设置(./Images/{0}.png)。
(5).【ButtonField】----绑定以按钮的形式显示一个字段(允许加床则为对号图片)。它的属性:
HeaderText----就是显示的列名。
ButtonType----该属性是一个枚举类型{Button,Image,Link},不同值对应不同的外观。
Text---按钮上显示的文本。
【怎么编辑按钮对应的事件???】------在控件的事件中找到【RowCommand事件】,所有发生在控件中的时间都在此事件中编辑。---------所以会出现这样的问题:假如GridView中有两列Button按钮,都在RowCommand事件中执行他们所触发的事件,那么怎么进行区分?------此时【ButtonField】的CommandName属性出场,为每个控件各自指定一个CommandName【注意:私人设置的CommandName不要取名为"Edit","Delete","Add"等等,因为这些都有自己的特殊意思】,在后台代码中捕获CommandName的值,就可以相应的判断是哪个控件触发的事件了。
1 protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 2 { 3 if (e.CommandName == "MyAdd") 4 { 5 Maticsoft.Common.MessageBox.Show(this, "点击按钮"); 6 } 7 else 8 { 9 Maticsoft.Common.MessageBox.Show(this, "Delete");10 }11 }
(6).【CommandField】-----展开它的节点,下面有三个不同的子节点,分别是:{(编辑,更新,取消) (选择) (删除)}。
HeaderText----就是显示的列名。
对于(编辑,更新,取消)来说,系统自动为他们注册了各自的CommandName属性(Edit,Update,CancelEdit),这也就是上面所说,为什么对于私人设置的CommandName要有规范的原因。另外,对于各个CommandName都有各自对应的事件(GridView1_RowEditing(),GridView1_RowUpdating(),GridView1_RowCancelingEdit())进行编写。
1 /// <summary> 2 /// 编辑事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 7 { 8 //EditIndex 属性:指用户正在编辑的行,如果没有编辑任何行,设置为-1 9 //NewEditIndex 属性:e.NewEditIndex是取到用户当前点击的行数。10 GridView1.EditIndex = e.NewEditIndex;11 12 //对于每次操作之后,都要进行一次数据绑定才能立即显示出修改后的效果13 GridView1.DataBind();14 }15 16 /// <summary>17 /// 取消编辑18 /// </summary>19 /// <param name="sender"></param>20 /// <param name="e"></param>21 protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)22 {23 //取消编辑时只需要将当前编辑行的EditIndex设置为-1即可24 GridView1.EditIndex = -1;25 GridView1.DataBind();26 }27 /// <summary>28 /// 更新事件29 /// </summary>30 /// <param name="sender"></param>31 /// <param name="e"></param>32 protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)33 {34 //ToDo:涉及到数据库内容的操作,后续补充35 }
PS:---------如果不想套用上面这套自动生成的模板,也可以人为地使用【ButtonField】模板,只需要将它的CommandName设置为(Edit,Update,CancelEdit)其中之一即可,你就可以拥有自己的【编辑,更新,取消更新】方法。
对于(删除)来说,系统自动为他注册了CommandName属性【Delete】,对应的事件为GridView1_RowDeleting()。
(7).【TemplateField】-------模板列的控件,和 ListView 很是类似。使用情况为:上述所提供的所有模板不满足需求是,手动定制所需要的模板。
添加模板列,设置HeaderText属性,然后跳转到GridView控件视图,点击右上角的编辑模板,跳转到编辑模板的界面。
-----实现【BoundField】效果----只需要在编辑模板界面拖入一个 Label 控件即可,显示“房间类型的代码”:
1 <ItemTemplate>2 <asp:Label ID="Label1" runat="server" Text=‘<%#Bind("TypeName") %>‘></asp:Label>3 </ItemTemplate>
PS------此中的 Text=‘<%#Bind("TypeName") %>‘ 必须这么写,容易放错的地方在于:
外面的单引号错写为双引号,还有少了#或者Bind,%和#中间不能有空格~~!!
------实现【HyperLinkField】效果----添加一个服务器端控件HyperLink,实现上述的”详细"效果:
1 <ItemTemplate>2 <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl=‘<%#"RoomType/Show.aspx?id="+Eval("TypeId")%>‘ >详细</asp:HyperLink>3 <a href=http://www.mamicode.com/"RoomType/Show.aspx?id=<%#Eval("TypeId") %>">详细</a>4 </ItemTemplate>
PS------上述的方法有很多很多....需要注意的地方:
1、ItemTemplate里面用服务端控件----第二行代码:
1)绑定的属性必须用单引号
NavigateUrl=‘<%#"RoomType/Show.aspx?id="+Eval("TypeId")%>‘
而HTML控件则单引号、双引号都行
href="http://www.mamicode.com/RoomType/Show.aspx?id=<%#Eval("TypeId") %>"
2)属性值里要么就是普通的值,要么就是整个绑定表达式,不能混着用 ,HTML控件就没有这个问题。
在服务端控件中不能写‘~/images/<%#Eval("PicPath")%>‘,在页面中增加FormatImgURL方法,参数为object类型。对于服务端控件,只能这样处理
NavigateUrl=‘<%#"RoomType/Show.aspx?id="+Eval("TypeId")%>‘
3)综上可得:服务端控件能不用就不用~~!!
----------实现【CommandField】效果------在 Itemplate 项模板 中放一个Button按钮,它的Text属性设置为“编辑”;在 编辑模板 中放置两个按钮,Text属性分别设置为 “更新”和“取消”,易错点在于漏掉了 CommandName属性的设定!!!
1 <asp:TemplateField HeaderText="自编">2 <ItemTemplate>3 <asp:Button ID="Button4" runat="server" Text="编辑‘" CommandName="Edit" />4 </ItemTemplate>5 <EditItemTemplate>6 <asp:Button ID="Button5" runat="server" Text="更新" CommandName="Update" />7 <asp:Button ID="Button6" runat="server" Text="取消" CommandName="Cancel" />8 </EditItemTemplate>
--------------------------------------------------------------------------------------------------------------------------------------------------------------
回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。----------------------对于这个错误地解决方法是:【在页面顶端的Page指令集中加入相应的 EnableEventValidation="false"】,这是为了(防止恶意的漏洞注入)的新功能~~!!
----------------------------------------------------------------------------------------------------------------------------------------------------------------
前台页面代码:
1 <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeBehind="GridView.aspx.cs" Inherits="Maticsoft.Web.GridView" EnableEventValidation="false" %> 2 3 <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 4 </asp:Content> 5 <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> 6 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" EnableModelValidation="True" OnRowCommand="GridView1_RowCommand" OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating"> 7 <Columns> 8 <asp:BoundField DataField="TypeName" DataFormatString="名称:{0}" HeaderText="房间类型" /> 9 <asp:CheckBoxField DataField="AddBed" HeaderText="是否加床" />10 <asp:HyperLinkField DataNavigateUrlFields="TypeId" DataNavigateUrlFormatString="./RoomType/Show.aspx?id={0}" HeaderText="详细" Text="详细" />11 <asp:ImageField DataImageUrlField="AddBed" DataImageUrlFormatString="./Images/{0}.png" HeaderText="是否加床">12 </asp:ImageField>13 <asp:ButtonField ButtonType="Button" CommandName="MyDelete" HeaderText="按钮" Text="按钮" />14 <asp:ButtonField CommandName="MyAdd" HeaderText="按钮’" Text="按钮‘" />15 <asp:CommandField ButtonType="Button" HeaderText="编辑" ShowEditButton="True" />16 <asp:CommandField ShowSelectButton="True" />17 <asp:TemplateField HeaderText="模板列">18 <ItemTemplate>19 <asp:Label ID="Label1" runat="server" Text=‘<%#Bind("TypeName") %>‘></asp:Label>20 </ItemTemplate>21 </asp:TemplateField>22 <asp:TemplateField HeaderText="超链接">23 <ItemTemplate>24 <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl=‘<%#"RoomType/Show.aspx?id="+Eval("TypeId")%>‘>详细</asp:HyperLink>25 <a href=http://www.mamicode.com/"RoomType/Show.aspx?id=<%#Eval("TypeId") %>">详细</a>26 </ItemTemplate>27 </asp:TemplateField>28 <asp:TemplateField HeaderText="自编">29 <ItemTemplate>30 <asp:Button ID="bianji" runat="server" Text="编辑‘" CommandName="MyEdit" />31 </ItemTemplate>32 <EditItemTemplate>33 <asp:Button ID="Button5" runat="server" Text="更新" CommandName="Update" />34 <asp:Button ID="Button6" runat="server" Text="取消" CommandName="Cancel" />35 </EditItemTemplate>36 </asp:TemplateField>37 </Columns>38 </asp:GridView>39 </asp:Content>
后台页面代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Web; 4 using System.Web.UI; 5 using System.Web.UI.WebControls; 6 7 namespace Maticsoft.Web 8 { 9 public partial class GridView : System.Web.UI.Page10 {11 Maticsoft.BLL.RoomType bll = new BLL.RoomType();12 13 protected void Page_Load(object sender, EventArgs e)14 {15 if (!Page.IsPostBack)16 {17 //想得到所有的数据,只要在参数中传递 空字符串即可!18 //返回值为 泛型集合19 this.Bind();20 }21 Bind();22 }23 24 private void Bind()25 {26 List<Model.RoomType> list = bll.GetModelList("");27 GridView1.DataSource = list;28 GridView1.DataBind();29 }30 31 protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)32 {33 if (e.CommandName == "MyEdit")34 {35 Maticsoft.Common.MessageBox.Show(this, "点击编辑按钮");36 }37 else38 {39 Maticsoft.Common.MessageBox.Show(this, "Delete");40 } 41 }42 43 /// <summary>44 /// 编辑事件45 /// </summary>46 /// <param name="sender"></param>47 /// <param name="e"></param>48 protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)49 {50 //EditIndex 属性:指用户正在编辑的行,如果没有编辑任何行,设置为-151 //NewEditIndex 属性:e.NewEditIndex是取到用户当前点击的行数。52 GridView1.EditIndex = e.NewEditIndex;53 54 //对于每次操作之后,都要进行一次数据绑定才能立即显示出修改后的效果55 GridView1.DataBind();56 }57 58 /// <summary>59 /// 取消编辑60 /// </summary>61 /// <param name="sender"></param>62 /// <param name="e"></param>63 protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)64 {65 //取消编辑时只需要将当前编辑行的EditIndex设置为-1即可66 GridView1.EditIndex = -1;67 GridView1.DataBind();68 }69 /// <summary>70 /// 更新事件71 /// </summary>72 /// <param name="sender"></param>73 /// <param name="e"></param>74 protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)75 {76 //ToDo:涉及到数据库内容的操作,后续补充77 }78 }79 }
GridView控件相关