ASP.net GridView Eval和Bind 区别小解

    

    最近在做课程设计,GridView绑定SqlDataSouce进行数据更新的时候出现了难点,就是自定义在EditItemTemplete里的控件无法获取服务器ID。也就是说,如果不用GridView自带的Row_Updating事件的话(也就是不能用myGridview.Rows[e.RowIndex].Cells[...].Controls[...].FindControl("控件ID")来搜索控件),我就不能传参给UpdateCommand!!!纠结了好久,现在把解决方案记下来。

 

http://www.cnblogs.com/yangfan/archive/2008/05/26/1207258.html

首先引用一篇网上点击最高的博客,引入BindEval的概念。

 

大体来说,Eval单纯用来展示数据Bind可以被修改并回写到数据库

那么问题就来了,怎么回写?

这是我的一个SqlDataSouce Demo

<asp:SqlDataSource ID="SqlDataSource" runat="server"
        ConnectionString="<%$ ConnectionStrings:MyConnection %>"
        SelectCommand="SELECT [RoomId],[RoomCategory].[RcategoryId],[RoomCategory].[categoryName],
        [Rposition], [Description] FROM [RoomsInfo],[roomcategory]
        where [RoomsInfo].[RcategoryId]=[RoomCategory].[RcategoryId]"
        UpdateCommand="update RoomsInfo set RcategoryId = @RcategoryId,Rposition = @Rposition,Description = @Description where RoomId = @RoomId">
        <UpdateParameters>
            <asp:Parameter Name="RcategoryId" Type="String" />
            <asp:Parameter Name="Rposition" Type="String" />
            <asp:Parameter Name="Description" Type="String" />
            <asp:Parameter Name="RoomId" Type="String" />
        </UpdateParameters>
    </asp:SqlDataSource>

请注意上面橙色的一个长字符串UpdateCommand里@开头的标变量和一个UpdateParameters标记段里的几个值。ASP.NET框架似乎就是用它们,实现了“识别”所有采用Bind字段绑定的值。那么到这里,我们先记住一点,他们是有先后顺序的!!!

 

 

我折腾了一下午带一个晚上,得出的理解是(如有错误,请一定告诉我!):你在GridView里用了多少个Bind,你UpdateCommand字符串里面至少就应该有多少个标变量

现在来看我的gridview:

<asp:GridView ID="myGridview" CssClass="GridViewStyle" runat="server" AllowSorting="True" AutoGenerateColumns="False" DataSourceID="SqlDataSource" DataKeyNames="RoomId">
            <Columns>
                <asp:TemplateField HeaderText="房间号" SortExpression="RoomId">
                    <ItemTemplate>
                        <asp:Label ID="Label_RoomId" runat="server" Text='<%# Eval("RoomId") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="房间类型" SortExpression="categoryName">
                    <ItemTemplate>
                        <asp:Label ID="Label_RcategoryId" runat="server" Text='<%# Eval("RcategoryId") %>'></asp:Label><asp:Label ID="Label_categoryName" runat="server" Text='<%# Eval("categoryName") %>'></asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox runat="server" ID="RcategoryId" Text='<%# Bind("RcategoryId") %>' />
                        <asp:RequiredFieldValidator ID="Req_RcategoryId" runat="server"
                            ErrorMessage="*"
                            ControlToValidate="RcategoryId"
                            Display="Dynamic"
                            ValidationGroup="submit"></asp:RequiredFieldValidator>
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="房间位置" SortExpression="Rposition">
                    <ItemTemplate>
                        <img src="../images/floors/floor<%# Eval("Rposition")%>.png" class="GridView_floorImg" title="此房间位于<%# Eval("Rposition")%>楼" alt="此房间位于<%# Eval("Rposition")%>楼" />
                    </ItemTemplate>
                    <EditItemTemplate>

                        <asp:TextBox runat="server" ID="Rposition" Text='<%# Bind("Rposition") %>' />
                        <asp:RequiredFieldValidator ID="Req_Rposition" runat="server"
                            ErrorMessage="*"
                            ControlToValidate="Rposition"
                            Display="Dynamic"
                            ValidationGroup="submit"></asp:RequiredFieldValidator>
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderStyle-CssClass="description-edit-delete-head" HeaderText="备注">
                    <ItemTemplate>
                        <span class="decriptionText"><%# Eval("Description")%></span>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox runat="server" ID="Description" Text='<%# Bind("Description") %>' />
                        <asp:RequiredFieldValidator ID="Req_Description" runat="server"
                            ErrorMessage="*"
                            ControlToValidate="Description"
                            Display="Dynamic"
                            ValidationGroup="submit"></asp:RequiredFieldValidator>
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderStyle-CssClass="description-edit-delete-head" HeaderText="编辑">
                    <EditItemTemplate>
                        <asp:ImageButton ID="ImageButton1" runat="server" CausesValidation="True" ValidationGroup="submit" CommandName="Update" OnClientClick="return confirm('请检查您的所有输入。\n请不要输入非法信息。\n\n确认要提交吗?');" ToolTip="更新" ImageUrl="../images/ico/update.png" CssClass="GridView_imgBtn_option" AlternateText="更新" />
                        <asp:ImageButton ID="ImageButton2" runat="server" CausesValidation="False" CommandName="Cancel" OnClientClick="return confirm('确认要放弃所有修改吗?');"  ToolTip="取消" ImageUrl="../images/ico/cancel.png" CssClass="GridView_imgBtn_option" AlternateText="取消" />
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:ImageButton ID="ImageButton1" runat="server" CausesValidation="False" CommandName="Edit" ToolTip="编辑" ImageUrl="../images/ico/edit.png" CssClass="GridView_imgBtn" AlternateText="编辑" />
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderStyle-CssClass="description-edit-delete-head" HeaderText="删除">
                    <ItemTemplate>
                        <asp:ImageButton ID="ImageButton_delete" runat="server" OnClientClick="return confirm('确认要删除此条信息吗?\n请谨慎操作,删除操作不可恢复!');" CausesValidation="False" CommandName="Delete" ToolTip="删除" ImageUrl="../images/ico/delete.png" AlternateText="删除" CssClass="GridView_imgBtn"></asp:ImageButton>
                    </ItemTemplate>
                </asp:TemplateField>

            </Columns>
            <FooterStyle CssClass="GridViewFooterStyle" />
            <RowStyle CssClass="GridViewRowStyle" />
            <SelectedRowStyle CssClass="GridViewSelectedRowStyle" />
            <PagerStyle CssClass="GridViewPagerStyle" />
            <HeaderStyle CssClass="GridViewHeaderStyle" />
        </asp:GridView>

我用橙色标记出了GridView中用了Bind的地方,总共三个,按顺序对应着UpDateCommand中前三个标变量。

至于框架是怎么识别RoomId字段的我还没有研究透,等研究透数据控件的原理或许就知道了,但起码现在对于我来说已经够用了!

注:此时我后台cs文件中并没有代码,GridView也并没有绑定Row_Updating事件,可一切就这么发生了!感想就是,对于初学者发现自己的数据成功绑定并正确得到修改还是很有成就感的。

 

看着同学项目中杂七杂八难看的代码,不禁感叹微软的小控件的微妙之处。

有空决定再写一篇关于CSS美化asp.net自带控件的博文吧!

 

转载于:https://www.cnblogs.com/Xsdd/p/4122064.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值