zoukankan      html  css  js  c++  java
  • 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('请检查您的所有输入。
    请不要输入非法信息。
    
    确认要提交吗?');" 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('确认要删除此条信息吗?
    请谨慎操作,删除操作不可恢复!');" 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自带控件的博文吧!

     

  • 相关阅读:
    enter事件处方方法
    vue 关于父组件无法触发子组件的事件的解决方法
    iview表格高度自适应只需要三步即可
    子组件触发父组件的方法
    组件之间的方法
    年与日时分秒各种格式 补0位的方法
    //定义一个函数,删除首个数组元素
    input标签内容改变的触发事件
    jQuery表单校验jquery.validate.js的使用
    jQuery BlockUI 实现锁屏
  • 原文地址:https://www.cnblogs.com/Xsdd/p/4122064.html
Copyright © 2011-2022 走看看