.NET GridView和ObjectDataSource使用时应该注意的一个地方
ObjectDataSource的使用的函数最好将变量名和数据库字段名统一,否则可能会出现错误
虽然有解决办法,但没必要浪费时间去玩那个,不就是变量名吗,无所谓的啦。
如果需要使用ObjectDataSource控件的更新和删除功能,一般是根据主键进行修改的,但是我在使用这个功能的时候,
由于把主键这个字段设置为了readonly(主键不能更新),结果传回去的时候主键值就没有了,后来想了个办法,用
cookieparam作为主键的来源,在gridview或者detailsview控件更新、删除之前(响应事件)将主键值写入cookie,感觉有
点笨,不过功能没什么问题,不知道大家是怎么做的。
编辑后记:
我发现自己真的很笨耶,晕死了。想要取回主键ID值,不用cookie那么麻烦去做,虽然可以实现功能,但肯定不好。
下面的方法应该才是正确的方法:
指定GridView或者DetailsView的 DataKeyNames 属性,比如你的主键ID是ID,则指定DataKeyNames"ID"
在objectdatasource或者其他数据源控件指定参数,如下:
<DeleteParameters>
<asp:ControlParameter ControlID="DetailsView1" PropertyName="SelectedValue" Type="int32" Name="ID" />
</DeleteParameters>
<UpdateParameters>
<asp:ControlParameter ControlID="DetailsView1" PropertyName="SelectedValue" Type="int32" Name="ID" />
// 其他参数
</UpdateParameters>
这样就可以传过去了
下面是我的一些代码:
DetailsView :
<asp:DetailsView ID="DetailsView1" runat="server" DataKeyNames="ContentID" AutoGenerateRows="False" BackColor="White"
BorderColor="White" BorderStyle="Ridge" BorderWidth="2px" CellPadding="3" CellSpacing="1"
DataSourceID="ObjectDataSource2" GridLines="None" Width="70%" RowStyle-HorizontalAlign="left">
<FooterStyle BackColor="#C6C3C6" ForeColor="Black" />
<EditRowStyle BackColor="#9471DE" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#DEDFDE" ForeColor="Black" />
<PagerStyle BackColor="#C6C3C6" ForeColor="Black" HorizontalAlign="Right" />
<HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#E7E7FF" />
<Fields>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:BoundField DataField="ContentID" HeaderText="ID" ReadOnly="True" />
<asp:BoundField DataField="ContentName" HeaderText="名称" />
<asp:BoundField DataField="ContentAuthor" HeaderText="作者" />
<asp:TemplateField HeaderText="关键字">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" Width="320px" TextMode="multiLine" Rows="5" runat="server" Text='<%# Bind("ContentKeyword") %>'></asp:TextBox>
</EditItemTemplate>
<InsertItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("ContentKeyword") %>'></asp:TextBox>
</InsertItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("ContentKeyword") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="SortOrder" HeaderText="排序" />
<asp:CheckBoxField DataField="IsFree" HeaderText="是否免费" />
<asp:CheckBoxField DataField="IsVisible" HeaderText="是否可见" />
<asp:BoundField DataField="ClickHit" HeaderText="点击数" ReadOnly="True" />
<asp:BoundField DataField="CreateTime" HeaderText="创建日期" ReadOnly="True" />
</Fields>
</asp:DetailsView>
ObjectDataSource :
<asp:ObjectDataSource ID="ObjectDataSource2" runat="server" DeleteMethod="deleteContent"
SelectMethod="getContentDetail" TypeName="ServiceContent" UpdateMethod="updateContent">
<DeleteParameters>
<asp:ControlParameter ControlID="DetailsView1" PropertyName="SelectedValue" Type="int32" Name="ContentID" />
</DeleteParameters>
<UpdateParameters>
<asp:ControlParameter ControlID="DetailsView1" PropertyName="SelectedValue" Type="int32" Name="ContentID" />
<asp:Parameter Name="ContentName" Type="String" />
<asp:Parameter Name="ContentAuthor" Type="String" />
<asp:Parameter Name="ContentKeyword" Type="String" />
<asp:Parameter Name="SortOrder" Type="Int32" />
<asp:Parameter Name="IsFree" Type="Int32" />
<asp:Parameter Name="IsVisible" Type="Int32" />
</UpdateParameters>
<SelectParameters>
<asp:QueryStringParameter DefaultValue="0" Name="ContentID" QueryStringField="ContentID"
Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
业务层代码:
static public DataSet getContent(int CatalogID)
static public void updateContent(int ContentID, string ContentName, string ContentAuthor, string ContentKeyword, int SortOrder, int IsFree, int IsVisible)
static public void deleteContent(int ContentID)
ObjectDataSource的使用的函数最好将变量名和数据库字段名统一,否则可能会出现错误
虽然有解决办法,但没必要浪费时间去玩那个,不就是变量名吗,无所谓的啦。
如果需要使用ObjectDataSource控件的更新和删除功能,一般是根据主键进行修改的,但是我在使用这个功能的时候,
由于把主键这个字段设置为了readonly(主键不能更新),结果传回去的时候主键值就没有了,后来想了个办法,用
cookieparam作为主键的来源,在gridview或者detailsview控件更新、删除之前(响应事件)将主键值写入cookie,感觉有
点笨,不过功能没什么问题,不知道大家是怎么做的。
编辑后记:
我发现自己真的很笨耶,晕死了。想要取回主键ID值,不用cookie那么麻烦去做,虽然可以实现功能,但肯定不好。
下面的方法应该才是正确的方法:
指定GridView或者DetailsView的 DataKeyNames 属性,比如你的主键ID是ID,则指定DataKeyNames"ID"
在objectdatasource或者其他数据源控件指定参数,如下:
<DeleteParameters>
<asp:ControlParameter ControlID="DetailsView1" PropertyName="SelectedValue" Type="int32" Name="ID" />
</DeleteParameters>
<UpdateParameters>
<asp:ControlParameter ControlID="DetailsView1" PropertyName="SelectedValue" Type="int32" Name="ID" />
// 其他参数
</UpdateParameters>
这样就可以传过去了
下面是我的一些代码:
DetailsView :
<asp:DetailsView ID="DetailsView1" runat="server" DataKeyNames="ContentID" AutoGenerateRows="False" BackColor="White"
BorderColor="White" BorderStyle="Ridge" BorderWidth="2px" CellPadding="3" CellSpacing="1"
DataSourceID="ObjectDataSource2" GridLines="None" Width="70%" RowStyle-HorizontalAlign="left">
<FooterStyle BackColor="#C6C3C6" ForeColor="Black" />
<EditRowStyle BackColor="#9471DE" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#DEDFDE" ForeColor="Black" />
<PagerStyle BackColor="#C6C3C6" ForeColor="Black" HorizontalAlign="Right" />
<HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#E7E7FF" />
<Fields>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:BoundField DataField="ContentID" HeaderText="ID" ReadOnly="True" />
<asp:BoundField DataField="ContentName" HeaderText="名称" />
<asp:BoundField DataField="ContentAuthor" HeaderText="作者" />
<asp:TemplateField HeaderText="关键字">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" Width="320px" TextMode="multiLine" Rows="5" runat="server" Text='<%# Bind("ContentKeyword") %>'></asp:TextBox>
</EditItemTemplate>
<InsertItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("ContentKeyword") %>'></asp:TextBox>
</InsertItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("ContentKeyword") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="SortOrder" HeaderText="排序" />
<asp:CheckBoxField DataField="IsFree" HeaderText="是否免费" />
<asp:CheckBoxField DataField="IsVisible" HeaderText="是否可见" />
<asp:BoundField DataField="ClickHit" HeaderText="点击数" ReadOnly="True" />
<asp:BoundField DataField="CreateTime" HeaderText="创建日期" ReadOnly="True" />
</Fields>
</asp:DetailsView>
ObjectDataSource :
<asp:ObjectDataSource ID="ObjectDataSource2" runat="server" DeleteMethod="deleteContent"
SelectMethod="getContentDetail" TypeName="ServiceContent" UpdateMethod="updateContent">
<DeleteParameters>
<asp:ControlParameter ControlID="DetailsView1" PropertyName="SelectedValue" Type="int32" Name="ContentID" />
</DeleteParameters>
<UpdateParameters>
<asp:ControlParameter ControlID="DetailsView1" PropertyName="SelectedValue" Type="int32" Name="ContentID" />
<asp:Parameter Name="ContentName" Type="String" />
<asp:Parameter Name="ContentAuthor" Type="String" />
<asp:Parameter Name="ContentKeyword" Type="String" />
<asp:Parameter Name="SortOrder" Type="Int32" />
<asp:Parameter Name="IsFree" Type="Int32" />
<asp:Parameter Name="IsVisible" Type="Int32" />
</UpdateParameters>
<SelectParameters>
<asp:QueryStringParameter DefaultValue="0" Name="ContentID" QueryStringField="ContentID"
Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
业务层代码:
static public DataSet getContent(int CatalogID)
static public void updateContent(int ContentID, string ContentName, string ContentAuthor, string ContentKeyword, int SortOrder, int IsFree, int IsVisible)
static public void deleteContent(int ContentID)