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は読み取り専用のデータバインドメソッドです。コントロールを自動的に更新できるようにするには、編集テンプレートでバインドを使用する必要があります。もちろん、データベースを手動で更新することもできますが、なぜ車輪の再発明を行うのでしょうか。

<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のDetailsViewページの更新はより簡潔です

于 2012-12-06T18:25:08.533 に答える