---恢复内容开始---
此文档主要侧重---GridView控件上的 【更新】 和 【删除】 两个事件的具体操作:
1.在非编辑状态,如何取出【BoundField】模板中的绑定值:
string s = GridView1.Rows[2].Cells[0].Text;
在编辑状态下,如何取出GridView中用【BouldField】绑定的内容------即,如何获得【TextBox】中用户输入的内容:
((TextBox)GridView1.Rows[2].Cells[0].Controls[0]).Text;
在GridView中,获得【模板列】中某个控件的值时,使用FindControl("")来得到这个控件
2.要实现【更新】和【删除】两个功能,必须在GridView控件上增加一列展示Id的值。
1).假如用【BoundField】来展示Id,则点击编辑后,Id也会变成可修改的,这样不符合业务逻辑,所以必须设置这个模板的一个属性ReadOnly=“true”。
2).用【BoundField】来展示Id的另一个问题,Id会在页面显示出来,对于用户来说,不友好(用户不明白Id代表什么意思)。解决方案----把【BoundField】隐藏,即Visable="False"。对于使用【BouldField】绑定数据,这一列如果被隐藏的话,那么隐藏的值无法获得到.
3).所以,对于上述情况的解决方案是,使用模板列来绑定Id,模板列隐藏,具体代码为:
1 <asp:TemplateField HeaderText="Id" Visible="False"> 2 <ItemTemplate> 3 <asp:Label runat="server" Text=‘<%#Eval("TypeId") %>‘></asp:Label> 4 </ItemTemplate> 5 </asp:TemplateField>
-------其中 Visible="False" 表示隐藏字段,不显示。
-------而 Text=‘<%#Eval("TypeId") %>‘ 和 Text=‘<%#Bind("TypeId") %>‘ 的区别在于:
区别 1.eval是只读数据,bind是可更新的. 2.当对次表达式操作时候,必须用Eval 如<%# Eval("字段名").ToString().Trim() %> 2.若GridView中绑定列里面 设置 内容格式 DataFormateString ={0:d} ,则 必须把 属性 HtmlCode 设置为false,否则无法 起作用; Eval 单向绑定:数据是只读的 |
前台页面代码:
1 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" EnableModelValidation="True" OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowDeleting="GridView1_RowDeleting" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating"> 2 <Columns> 3 <asp:TemplateField HeaderText="Id" Visible="False"> 4 <ItemTemplate> 5 <asp:Label ID="id" runat="server" Text=‘<%#Bind("TypeId") %>‘></asp:Label> 6 </ItemTemplate> 7 </asp:TemplateField> 8 <asp:BoundField DataField="TypeName" HeaderText="房间类型"> 9 <ItemStyle Width="100px"></ItemStyle> 10 </asp:BoundField> 11 <asp:BoundField DataField="Price" HeaderText="房间价格" > 12 <ItemStyle Width="100px"></ItemStyle> 13 </asp:BoundField> 14 <asp:CheckBoxField DataField="AddBed" HeaderText="是否加床"> 15 <ItemStyle Width="50px"></ItemStyle> 16 </asp:CheckBoxField> 17 <asp:BoundField DataField="BedPrice" HeaderText="加床价格"> 18 <ItemStyle Width="100px"></ItemStyle> 19 </asp:BoundField> 20 <asp:BoundField DataField="Remark" HeaderText="备注"> 21 <ItemStyle Width="200px"></ItemStyle> 22 </asp:BoundField> 23 <asp:TemplateField HeaderText="编辑;删除" ShowHeader="False"> 24 <EditItemTemplate> 25 <asp:LinkButton runat="server" CausesValidation="True" CommandName="Update" Text="更新"></asp:LinkButton> 26 <asp:LinkButton runat="server" CausesValidation="False" CommandName="Cancel" Text="取消"></asp:LinkButton> 27 </EditItemTemplate> 28 <ItemTemplate> 29 <asp:LinkButton runat="server" CausesValidation="False" CommandName="Edit" Text="编辑"></asp:LinkButton> 30 <asp:LinkButton runat="server" CausesValidation="False" CommandName="Delete" Text="删除"></asp:LinkButton> 31 </ItemTemplate> 32 <ItemStyle HorizontalAlign="Center" Width="100px" Wrap="false" /> 33 </asp:TemplateField> 34 </Columns> 35 </asp:GridView>
后台页面代码:
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 _1 : System.Web.UI.Page 10 { 11 Maticsoft.BLL.RoomType bll = new BLL.RoomType(); 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 if (!IsPostBack) 15 { 16 GridViewDataBind(); 17 } 18 } 19 /// <summary> 20 /// 绑定数据 21 /// </summary> 22 private void GridViewDataBind() 23 { 24 //想得到所有的数据,只要在参数中传递 空字符串即可! 25 //返回值为 泛型集合 26 List<Model.RoomType> list = bll.GetModelList(""); 27 GridView1.DataSource = list; 28 GridView1.DataBind(); 29 } 30 /// <summary> 31 /// 取消编辑 32 /// </summary> 33 /// <param name="sender"></param> 34 /// <param name="e"></param> 35 protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 36 { 37 //取消编辑时只需要将当前编辑行的EditIndex设置为-1即可 38 GridView1.EditIndex = -1; 39 40 //对于每次操作之后,都要进行一次数据绑定才能立即显示出修改后的效果 41 GridViewDataBind(); 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 属性:指用户正在编辑的行,如果没有编辑任何行,设置为-1 51 //NewEditIndex 属性:e.NewEditIndex是取到用户当前点击的行数。 52 GridView1.EditIndex = e.NewEditIndex; 53 GridViewDataBind(); 54 } 55 /// <summary> 56 /// 更新事件 57 /// </summary> 58 /// <param name="sender"></param> 59 /// <param name="e"></param> 60 protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 61 { 62 //先判断GridView1是否处于编辑状态 63 if (GridView1.EditIndex == -1) 64 { 65 return; 66 } 67 //取到当前编辑列的索引,即列数 68 int editindex = GridView1.EditIndex; 69 70 //编辑状态下,通过下面这种方法获取到修改后的值 71 string typename = ((TextBox)GridView1.Rows[editindex].Cells[1].Controls[0]).Text; 72 decimal price = Convert.ToDecimal(((TextBox)GridView1.Rows[editindex].Cells[2].Controls[0]).Text); 73 bool addbed = ((CheckBox)GridView1.Rows[editindex].Cells[3].Controls[0]).Checked; 74 decimal bedprice = Convert.ToDecimal(((TextBox)GridView1.Rows[editindex].Cells[4].Controls[0]).Text); 75 string remark = ((TextBox)GridView1.Rows[editindex].Cells[5].Controls[0]).Text; 76 77 //在GridView中,获得模板列中某个控件的值时,使用FindControl("控件ID")来得到这个控件 78 //GridView1.Rows[editRowIndex].Cells[0].FindControl("id") 79 //(Label)GridView1.Rows[editRowIndex].Cells[0].FindControl("id"))----控件强转为Label 80 //((Label)GridView1.Rows[editRowIndex].Cells[0].FindControl("id")).Text----取到Label的Text 81 //Convert.ToInt32(~)-----------------将Text的String类型转换为int类型 82 //////综上:获得了Id属性 83 int id = Convert.ToInt32(((Label)GridView1.Rows[editindex].Cells[1].FindControl("id")).Text); 84 85 //修改前,先通过Id获得数据库中,模型的默认值 86 Model.RoomType model = new Model.RoomType(); 87 model = bll.GetModel(id); 88 89 //将修改后的值更新到模型中,然后再更新到数据库中,其他值保持不变 90 model.TypeName = typename; 91 model.Price = price; 92 model.AddBed = addbed; 93 model.BedPrice = bedprice; 94 model.Remark = remark; 95 96 if (bll.Update(model)) 97 { 98 Maticsoft.Common.MessageBox.Show(this, "更新信息成功!"); 99 100 //很关键的一步:修改成功后,应将GridView设置为非编辑状态,即 GridView1.EditIndex = -1; 101 GridView1.EditIndex = -1; 102 103 //然后,再次绑定数据,这样才能展示给用户更新后的信息 104 this.GridViewDataBind(); 105 } 106 else 107 { 108 Maticsoft.Common.MessageBox.Show(this, "更新信息失败!"); 109 } 110 111 112 } 113 /// <summary> 114 /// 删除事件 115 /// </summary> 116 /// <param name="sender"></param> 117 /// <param name="e"></param> 118 protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 119 { 120 int editindex = GridView1.EditIndex; 121 int id = Convert.ToInt32((((Label)GridView1.Rows[0].Cells[0].FindControl("id")).Text)); 122 if (bll.Delete(id)) 123 { 124 Maticsoft.Common.MessageBox.Show(this, "删除成功!"); 125 GridViewDataBind(); 126 } 127 else 128 { 129 Maticsoft.Common.MessageBox.Show(this, "删除成功!"); 130 } 131 } 132 } 133 }
//上面修改代码有些失误:
int editindex = e.RowIndex;
int id = Convert.ToInt32((((Label)GridView1.Rows[editindex].Cells[0].FindControl("id")).Text));
---恢复内容结束---