0

在过去的几天里,我一直在尝试使用 DetailsView 来显示和编辑从 GridView 获取的单个记录中的数据,它们都从 SqlDataSource 读取它们的数据。

我一直在互联网和 MSDN 上搜索有关如何使用 DetailsView 编辑数据的信息,并且我设法将一些东西拼凑在一起,问题是显然实际的更新方法没有运行。

所以这是我的代码的摘录

GridView 页面中:

                <asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="125px" AutoGenerateRows="False" DefaultMode="Edit">
                    <fields>
                        <asp:TemplateField HeaderText="Codice Cliente">
                            <ItemTemplate>
                                <asp:Label ID="lblCliCod" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_cod") %>'></asp:Label>
                            </ItemTemplate>
                            <EditItemTemplate>
                                <asp:TextBox ID="txtCliCod" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_cod")%>'></asp:TextBox>
                            </EditItemTemplate>
                        </asp:TemplateField>

                        <asp:TemplateField HeaderText="Descrizione">
                            <ItemTemplate>
                                <asp:Label ID="lblCliDesc" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_desc")%>'></asp:Label>
                            </ItemTemplate>
                            <EditItemTemplate>
                                <asp:TextBox ID="txtCliDesc" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_desc")%>'></asp:TextBox>
                            </EditItemTemplate>
                        </asp:TemplateField>

                        <asp:TemplateField HeaderText="Nome Utente">
                            <ItemTemplate>
                                <asp:Label ID="lblCliUser" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_user")%>'></asp:Label>
                            </ItemTemplate>
                            <EditItemTemplate>
                                <asp:TextBox ID="txtCliUser" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_user")%>'></asp:TextBox>
                            </EditItemTemplate>
                        </asp:TemplateField>

                        <asp:TemplateField HeaderText="Password">
                            <ItemTemplate>
                                <asp:Label ID="lblCliPass" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_pass")%>'></asp:Label>
                            </ItemTemplate>
                            <EditItemTemplate>
                                <asp:TextBox ID="txtCliPass" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_pass")%>'></asp:TextBox>
                            </EditItemTemplate>
                        </asp:TemplateField>

                        <asp:TemplateField HeaderText="Amministratore">
                            <ItemTemplate>
                                <asp:Label ID="lblCliAdmin" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_admin")%>'></asp:Label>

                            </ItemTemplate>
                            <EditItemTemplate>
                                <asp:CheckBox ID="chkCliAdminE" runat="server" Text='<%# CBool(DataBinder.Eval(Container, "DataItem.cli_admin"))%>' />
                            </EditItemTemplate>
                        </asp:TemplateField>

                        <asp:TemplateField>
                            <EditItemTemplate>

                                <asp:LinkButton Text="Aggiorna" ID="UpdateButton" runat="Server" CommandName="Update"></asp:LinkButton>
                                <asp:LinkButton Text="Elimina" ID="DeleteButton" runat="server" CommandName="Edit"></asp:LinkButton>
                            </EditItemTemplate>
                        </asp:TemplateField>
                    </fields>
                </asp:DetailsView>

代码隐藏的相关部分:

Private Sub SetupDataSource() 'this is the sqldatasource I'm using for the detailsview

    SqlDataSource2.ConnectionString = Assist.connectionString
    SqlDataSource2.SelectCommand = detailsSelect
    SqlDataSource2.SelectParameters.Add(New Parameter("id"))

    SqlDataSource2.UpdateCommand = detailsUpdate
    SqlDataSource2.UpdateParameters.Add(New Parameter("cli_cod"))
    SqlDataSource2.UpdateParameters.Add(New Parameter("cli_desc"))
    SqlDataSource2.UpdateParameters.Add(New Parameter("cli_user"))
    SqlDataSource2.UpdateParameters.Add(New Parameter("cli_pass"))
    SqlDataSource2.UpdateParameters.Add(New Parameter("cli_admin"))

End Sub

Private Sub SetupDetailsView(id As Int32)
    DetailsView1.AutoGenerateRows = False
    DetailsView1.DataSource = SqlDataSource2

    SqlDataSource2.SelectParameters("id").DefaultValue = id

End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    cn.Open()
    SetupDataSource()

   If Not IsPostBack Then
        Dim id As String = Request.QueryString("id")
        If id <> "" Then

            SetupDetailsView(id)
            DetailsView1.DataBind()
        End If
    End If
End Sub

    Protected Sub DetailsView1_ItemUpdating(sender As Object, e As DetailsViewUpdateEventArgs) Handles DetailsView1.ItemUpdating
    Dim cliCod As String = (CType(DetailsView1.FindControl("txtCliCod"), TextBox)).Text.ToString()
    Dim cliDesc As String = (CType(DetailsView1.FindControl("txtCliDesc"), TextBox)).Text.ToString()
    Dim cliUser As String = (CType(DetailsView1.FindControl("txtCliUser"), TextBox)).Text.ToString()
    Dim cliPass As String = (CType(DetailsView1.FindControl("txtCliPass"), TextBox)).Text.ToString()
    Dim cliAdmin As Boolean = If((CType(DetailsView1.FindControl("chkCliAdminE"), CheckBox)).Checked = True, True, False)

    SqlDataSource2.UpdateParameters("cli_cod").DefaultValue = cliCod
    SqlDataSource2.UpdateParameters("cli_desc").DefaultValue = cliDesc
    SqlDataSource2.UpdateParameters("cli_user").DefaultValue = cliUser
    SqlDataSource2.UpdateParameters("cli_pass").DefaultValue = cliPass
    SqlDataSource2.UpdateParameters("cli_Admin").DefaultValue = If(cliAdmin = True, "1", "0")


    DetailsView1.DataBind()
End Sub

我要么遗漏了某些东西,要么在某处做错了,这是哪一个,为什么?

4

2 回答 2

0

我不是使用 SqlDataSource 的专家,但您可以尝试SqlDataSource.Update在 Item_Updating 方法中插入一个:

SqlDataSource2.UpdateParameters("cli_cod").DefaultValue = cliCod
SqlDataSource2.UpdateParameters("cli_desc").DefaultValue = cliDesc
SqlDataSource2.UpdateParameters("cli_user").DefaultValue = cliUser
SqlDataSource2.UpdateParameters("cli_pass").DefaultValue = cliPass
SqlDataSource2.UpdateParameters("cli_Admin").DefaultValue = If(cliAdmin = True, "1", "0")

SqlDataSource2.Update();

DetailsView1.DataBind()
于 2012-12-06T18:14:18.173 回答
0

我在正在进行的项目中使用 DetailsView。它们很挑剔,但在正确设置时效果很好。

我可以通过您的 DetailsView 看到的几个潜在问题是:

评估与绑定

与所有数据绑定控件一样,Databinder.Eval 是一种只读数据绑定方法。要允许控件自动更新,您必须在编辑模板中使用 Bind。当然,您可以手动更新数据库,但为什么要重新发明轮子呢?

<asp:TemplateField HeaderText="Codice Cliente">
<ItemTemplate>
<asp:Label ID="lblCliCod" runat="server" Text='<%# Eval("DataItem.cli_cod") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtCliCod" runat="server" Text='<%# Bind("DataItem.cli_cod")%>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>

内置更新功能与手动更新功能

您实际上不需要使用 DetailsView1_ItemUpdating ,除非您想在提交之后和提交到数据源之前捕获和修改值。即将单个年/月/日文本框连接成一个日期。

但是,由于您当前没有生成更新按钮(使用属性 AutoGenerateEditButton="True"),因此您可能需要在尝试时手动处理更新。或者,对于基本绑定和更新,我会注释掉更新函数,添加 autogenerateeditbutton="True" 属性,然后尝试更新。

首要的关键

对于某些数据源,您必须在 DetailsView 上指定 DataKeyNames 属性(您的数据源的主键)以启用自动绑定。我不确定,但您可能还需要设置 DefaultMode 属性。

所有属性和方法都在MSDN DetailsView 页面上得到了很好的解释,但它相当冗长。MSDN Updating a DetailsView 页面更简洁

于 2012-12-06T18:25:08.533 回答