我的一个叫“dvwBook”的DetailsView控件,因为需要,我是用手动去绑定的,没有用DataSource去绑定,所以也无法“无代码”式去实现那些更新,删除等操作。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
ddlBind();//这个是绑定的函数。
}
这个DetailsView里面有一些是自动绑定的BoundField,有一些是自己添加的模版,里面有下拉匡等。
这些都成功绑定了。能显示数据且进入时默认是编辑状态。
然后,按更新按钮的程序我就不太会写了。
protected void dvwBook_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
{
。。。。。
}
网上看到:
tb = (TextBox)(DetailsView1.Rows[3].FindControl("TextBox4"));
这样可以取得模板里面自己添加的textbox控件的值,然后用SQL自己更新就行了。
但如果是那行是自动绑定的BoundField应该FindControl什么呢?BoundField也好像没有什么ID。
或者是有什么其它方法方便些?
第一次用DetailsView,各方面都不是很了解,高手指教一下。
------解决方案--------------------------------------------------------
用ItemTemplate手动控制用什么控件显示什么。以Northwind数据库的Products表的ProductID, ProductName, UnitPrice三个列的更新为例,
AutoGenerateRows设为false,在ItemTemplate内放置TextBox,也就是和默认编辑状态一样。
加一个CommandName为Wahaha的Button。
- HTML code
<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="false" onitemcommand="DetailsView1_ItemCommand"> <Fields> <asp:TemplateField> <HeaderTemplate> 商品ID: </HeaderTemplate> <ItemTemplate> <asp:Label ID="LabelProductID" Text='<%# Eval("ProductID") %>' runat="server" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField> <HeaderTemplate> 商品名: </HeaderTemplate> <ItemTemplate> <asp:TextBox ID="TextBoxProductName" Text='<%# Bind("ProductName") %>' runat="server" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField> <HeaderTemplate> 价格: </HeaderTemplate> <ItemTemplate> <asp:TextBox ID="TextBoxUnitPrice" Text='<%# Bind("UnitPrice") %>' runat="server" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField> <ItemTemplate> <asp:Button ID="UpdateBtn" Text="更新" CommandName="Wahaha" runat="server" /> </ItemTemplate> </asp:TemplateField> </Fields> </asp:DetailsView>
------解决方案--------------------------------------------------------
如果你用的是BoundField,应该要使用Controls[索引]去访问,这样是非常不正规的做法,强烈建议使用TemplateField
而且不会使用TemplateField 基本等于不会使用数据绑定控件