在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近在做课程设计,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 首先引用一篇网上点击最高的博客,引入Bind和Eval的概念。
大体来说,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自带控件的博文吧!
|
请发表评论