在做牛腩新闻发布系统时,我们使用Gridview来显示我们查询出来的数据,可以直接通过编辑模板列的属性来绑定我们查询到的字段属性。但是如何在后台获取我们前台已经显示出来的数据中的某个字段信息呢?
需求:厨师配置菜单,只有配置成可见的菜单,前台用户才可以进行订餐。在这里有两个需要注意的地方,第一是如果厨师已经设置好菜单,当厨师进入该界面时需要勾选对应的菜单;第二是厨师勾选之后,将数据保存到数据库。
实现过程:
前台的页面设置如下:
<asp:GridView ID="GridView1" class="gv" runat="server" AutoGenerateColumns="False" OnRowUpdating="gvFood_Updating" DataKeyNames="foodState" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="3" AllowPaging="True" OnPageIndexChanging="gvFood_PageIndexChanging" OnSelectedIndexChanged="gvFood_SelectedIndexChanged" HorizontalAlign="Center" EmptyDataText="您好,没有您要查找的记录." > <FooterStyle BackColor="White" ForeColor="#000066" /> <RowStyle ForeColor="#000066" HorizontalAlign="Center" /> <PagerStyle HorizontalAlign="Center" /> <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" HorizontalAlign="Center" /> <AlternatingRowStyle BackColor="#F7F7F7" /> <Columns> <asp:BoundField DataField="foodId" HeaderText="食物编号" ReadOnly="True" ItemStyle-HorizontalAlign="Center"> <ItemStyle HorizontalAlign="Center"></ItemStyle> </asp:BoundField> <asp:BoundField DataField="foodName" HeaderText="食物名称" ReadOnly="True" ItemStyle-HorizontalAlign="Center"> <ItemStyle HorizontalAlign="Center"></ItemStyle> </asp:BoundField> <asp:BoundField DataField="price" HeaderText="食物价格" ReadOnly="True" ItemStyle-HorizontalAlign="Center"> <ItemStyle HorizontalAlign="Center"></ItemStyle> </asp:BoundField> <asp:TemplateField HeaderText="选中"> <ItemTemplate > <asp:CheckBox ID="ckbSelect" runat="server" AutoPostBack="true" OnLoad="ckbSelect_Load" OnCheckedChanged="ckbSelect_CheckedChanged" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
界面如下:
实现一:获取可见模板的值
/// <summary> /// 根据checkbox来设置菜单 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ckbSelect_CheckedChanged(object sender, EventArgs e) { //循环gridview中的值 for (int i = 0; i < GridView1.Rows.Count; i++) { //获取checkbox属性 CheckBox chk = (CheckBox)(GridView1.Rows[i].FindControl("ckbSelect")); if (chk.Checked == true) {//设置菜单可用 //获取第一列的食物编号 string foodId = GridView1.Rows[i].Cells[0].Text.ToString(); string state = "t"; //更新菜单设置 bool flag = menu.UpdateFoodState(foodId, state); if (!flag) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('设置失败,请联系管理员!');</script>"); } } else {//设置菜单不可用 string foodId = GridView1.Rows[i].Cells[0].Text.ToString(); string state = "f"; bool flag = menu.UpdateFoodState(foodId, state); if (!flag) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('设置失败,请联系管理员!');</script>"); } } //重新绑定数据源 DataTable tableSelected = menu.QuerySelectedFood(); //显示设置好的菜单 gwSelected.DataSource = tableSelected; gwSelected.DataBind(); } }这种获取方法跟以前用table获取值是一样的,唯一有区别的是,使用Gridview时,一定要注意后边必须加上Text,就因为好几次忘记加这个属性,调试好长时间才找到原因。
实现二:获取不可见模板值
实现一中主要是在菜单页进行设置勾选,但是如果厨师已经设置好某一天的菜单后,进入该页面时应该将对应的菜单勾选。从功能上来说这个很容易实现,只需要根据菜单的状态属性设置即可,但是我们发现,在前台页面的显示中我们并没有看见关于状态的字段,当然也不能就因为这个而把那些不必要的字段给用户显示出来。这时,就需要将状态字段隐藏。那么,现在的问题就是获取隐藏字段的属性值。
首先是在原来的界面中增加一列模板,并且设置其属性不可见:
<asp:BoundField DataField="foodState" HeaderText="是否显示" visible="false" ReadOnly="false" ItemStyle-HorizontalAlign="Center"> <ItemStyle HorizontalAlign="Center"></ItemStyle> </asp:BoundField>后台获取属性值:
protected void ckbSelect_Load(object sender, EventArgs e) { //是否是第一次加载 if (!IsPostBack) { for (int i = 0; i < GridView1.Rows.Count; i++) { CheckBox chk = (CheckBox)(GridView1.Rows[i].FindControl("ckbSelect")); //根据隐藏的状态属性来判断是否勾选 if (GridView1.DataKeys[i]["foodState"].ToString().Trim() == "t") { //设置勾选 chk.Checked = true; } } }实现效果:(下图是第一次加载页面时)
小结:
通过这次学习,对Gridview绑定数据源有了进一步的认识。刚开始的时候是使用的Repeater控件进行绑定的,然后又换成了Gridview,那么这两者有什么区别呢?下次将对这两者进行对比,灵活掌握绑定数据的方法。