1

グリッド ビューがあり、それに SQL データ ソースを結合しました。ページにドロップダウンがあり、ドロップダウンの選択した値が変更されるとすぐに、SQLデータソースの選択クエリを変更し、データをグリッドビューに再度バインドします。これを行う前に、グリッドビューの行を更新すると更新されますが、前のプロセスを実行した後、更新が機能しません。エラーは表示されません。編集された値は取りません。

私のグリッドビュー

<asp:GridView ID="gvTests" runat="server" AutoGenerateColumns="False" EmptyDataText="Testes are not assigned to this sample type."
    CellPadding="4" CssClass="border" DataKeyNames="TestId" DataSourceID="SqlDS"
    AlternatingRowStyle-BackColor="#E0ECF8" HeaderStyle-Height="20px" ForeColor="#333333"
    HeaderStyle-HorizontalAlign="Left" GridLines="None" Width="100%" OnRowCommand="gvTests_RowCommand"
    AllowPaging="True" AllowSorting="True" OnRowDataBound="gvTests_RowDataBound">
    <AlternatingRowStyle />
    <Columns>
        <asp:TemplateField HeaderText="TestId" InsertVisible="False" SortExpression="TestId"
            Visible="False">
            <EditItemTemplate>
                <asp:Label ID="lblId" runat="server" Text='<%# Eval("Id") %>'></asp:Label>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="lblId" runat="server" Text='<%# Bind("Id") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Test" SortExpression="TestName" HeaderStyle-HorizontalAlign="Center">
            <EditItemTemplate>
                <asp:TextBox CssClass="smallinput_t200" Width="100px" Text='<%# Bind("Name") %>'
                    ID="txtTestName" runat="server"></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField ShowHeader="False">
            <EditItemTemplate>
                <asp:LinkButton ID="LinkButtonUpdate" runat="server" CausesValidation="True" CommandName="Update"
                    Text="Update"></asp:LinkButton>
                &nbsp;<asp:LinkButton ID="LinkButtonCancel" runat="server" CausesValidation="False"
                    CommandName="Cancel" Text="Cancel"></asp:LinkButton>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:LinkButton ID="LinkButtonEdit" runat="server" CausesValidation="False" CommandName="Edit"
                    Text="Edit"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:LinkButton ID="LinkButtonDelete" runat="server" CausesValidation="False" CommandName="Del"
                    Text="Delete" ></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:LinkButton ID="LinkButtonSelect" runat="server" CausesValidation="False" CommandName="Select"
                    Text="Edit"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
    <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#6B89AD" ForeColor="White" HorizontalAlign="Center" />
    <RowStyle CssClass="mytr" />
    <SelectedRowStyle BackColor="#6B89AD" ForeColor="White" />
    <SortedAscendingCellStyle BackColor="#E9E7E2" />
    <SortedAscendingHeaderStyle BackColor="#506C8C" />
    <SortedDescendingCellStyle BackColor="#FFFDF8" />
    <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
</asp:GridView>

SQLデータソースはこのようなものです

<asp:SqlDataSource ID="SqlDS" runat="server" ConnectionString="<%$ ConnectionStrings:ApplicationServices %>"       
    SelectCommand="select * from tests"         
    UpdateCommand="Update [Tests] set [Name]=@TestName where [Id]=@TestId"
   >
   <FilterParameters>
   </FilterParameters>
    <UpdateParameters>
        <asp:Parameter Name="Name" DbType="String" />
        <asp:Parameter Name="Id" DbType="Int32" />
    </UpdateParameters>
</asp:SqlDataSource>

私のドロップダウンは

<asp:DropDownList ID="ddlType" runat="server"
                        DataSourceID="SqlDS" DataTextField="Name" 
                        DataValueField="Id" OnSelectedIndexChanged="ddlType_SelectedIndexChanged"
                        AutoPostBack="True" OnDataBound="ddlSampleType_DataBound">
                    </asp:DropDownList>  

インデックス変更コードは次のとおりです

protected void ddlType_SelectedIndexChanged(object sender, EventArgs e)
    {
        SqlDS.SelectCommand = "select * from Tests t where t.Id in (1,2,3,4,5)";
        SqlDS.Select(DataSourceSelectArguments.Empty);
        gvTests.EditIndex = -1;
        gvTests.DataBind();
    }

行編集コードは次のとおりです

protected void gvTests_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Update")
        {
            GridViewRow row = (GridViewRow)((LinkButton)e.CommandSource).NamingContainer;
            SqlDSTests.UpdateParameters["Name"].DefaultValue = (row.FindControl("txtName") as TextBox).Text;
            SqlDSTests.UpdateParameters["Id"].DefaultValue = (row.FindControl("lblId") as Label).Text;
            SqlDSTests.Update();
            SqlDS.Select(DataSourceSelectArguments.Empty);
            gvTests.EditIndex = -1;
            gvTests.DataBind();
        }
   }
4

1 に答える 1

1

SQLデータソースのSelectCommandプロパティが(セキュリティ上の目的で)ビューステートによってバックアップされていないため、これが発生していると思われます。したがって、イベントの1つでselectコマンドを変更すると、その変更はその要求に対してのみ反映されます。後続のポストバック(更新イベントの場合)では、design time selectコマンドが使用され、grid-viewにバインドされたデータが変更され、更新が失敗する場合があります。

解決策として、 FilterExpressionを使用してみてFilterParameters、シナリオで意味があるかどうかを確認できます(FilterExpressionヘルプの例を確認してください)。

于 2012-12-28T07:19:55.687 に答える