Параметры SqlDataSource UpdateCommand не меняются

У меня есть FormView с UpdateButton и SqlDataSource, которые ниже. Мой updatebutton всегда обновляет таблицу Sil одними и теми же значениями (значения в первой строке моего gridview), я не мог понять, почему.

<asp:FormView ID="frm_Benefit" runat="server" DataKeyNames="ID" DataSourceID="sds_Benefits"
            OnItemInserted="frm_Benefit_ItemInserted" OnItemUpdated="frm_Benefit_ItemUpdated">
    <EditItemTemplate>
        <table class="formview">
            <tr>
                <td>
                    Code:
                </td>
                <td>
                    <asp:TextBox ID="CodeTextBox" runat="server" Text='<%# Bind("Code") %>' />
                </td>
            </tr>
            <tr>
                <td>
                    Name:
                </td>
                <td>
                    <asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>' />
                </td>
            </tr>
            <tr>
                <td>
                    HRName:
                </td>
                <td>
                    <asp:TextBox ID="HRNameTextBox" runat="server" Text='<%# Bind("HRName") %>' />
                </td>
            </tr>
            <tr>
                <td>
                    Description:
                </td>
                <td>
                    <asp:TextBox ID="DescriptionTextBox" runat="server" Text='<%# Bind("Description") %>'
                        TextMode="MultiLine" MaxLength="200" />
                </td>
            </tr>
            <tr>
                <td>
                    Associated Url:
                </td>
                <td>
                    <asp:TextBox ID="UrlTextBox" runat="server" Text='<%# Bind("Url") %>' MaxLength="100" />
                </td>
            </tr>
            <tr>
                <td>
                    BenefitType:
                </td>
                <td>
                    <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="sds_BenefitTypes"
                        DataTextField="Name" DataValueField="ID" SelectedValue='<%# Bind("BenefitTypeID") %>'>
                    </asp:DropDownList>
                </td>
            </tr>
            <tr>
                <td>
                    Cost:
                </td>
                <td>
                    <asp:TextBox ID="CostTextBox" runat="server" Text='<%# Bind("Cost") %>' />
                </td>
            </tr>
            <tr>
                <td>
                    Cost Type:
                </td>
                <td>
                    <asp:DropDownList ID="CostTypeDropDown" runat="server" DataSourceID="sds_CostTypes"
                        DataTextField="Name" DataValueField="ID" SelectedValue='<%# Bind("CostTypeID") %>'>
                    </asp:DropDownList>
                </td>
            </tr>
            <tr>
                <td>
                    Quantity Type:
                </td>
                <td>
                    <asp:DropDownList ID="QuantityTypeDropDown" runat="server" DataSourceID="sds_QuantityTypes"
                        DataTextField="Name" DataValueField="ID" SelectedValue='<%# Bind("QuantityTypeID") %>'>
                    </asp:DropDownList>
                </td>
            </tr>
            <tr>
                <td>
                    Quantity Entry On Add:
                </td>
                <td>
                    <asp:CheckBox ID="QuantityEntryOnAddCheckBox" runat="server" Checked='<%# Bind("QuantityEntryOnAdd") %>' />
                </td>
            </tr>
            <tr>
                <td>
                    Quantity Entry On Remove:
                </td>
                <td>
                    <asp:CheckBox ID="QuantityEntryOnRemoveCheckBox" runat="server" Checked='<%# Bind("QuantityEntryOnRemove") %>' />
                </td>
            </tr>
            <tr>
                <td>
                    Bonus Ratio:
                </td>
                <td>
                    <asp:TextBox ID="BonusRatioTextBox" runat="server" Text='<%# Bind("BonusRatio") %>'></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td>
                    ApplyIncomeTax:
                </td>
                <td>
                    <asp:CheckBox ID="ApplyIncomeTaxCheckBox" runat="server" Checked='<%# Bind("ApplyIncomeTax") %>' />
                </td>
            </tr>
            <tr>
                <td>
                    ApplyStampTax:
                </td>
                <td>
                    <asp:CheckBox ID="ApplyStampTaxCheckBox" runat="server" Checked='<%# Bind("ApplyStampTax") %>' />
                </td>
            </tr>
            <tr>
                <td class="style1">
                    ApplySocialSecurityTax:
                </td>
                <td class="style1">
                    <asp:CheckBox ID="ApplySocialSecurityTaxCheckBox" runat="server" Checked='<%# Bind("ApplySocialSecurityTax") %>' />
                </td>
            </tr>
            <tr>
                <td>
                    Applicable Location:
                </td>
                <td>
                    <asp:DropDownList ID="CostTypeDropDown1" runat="server" DataSourceID="sds_Locations"
                        DataTextField="Name" DataValueField="ID" SelectedValue='<%# Bind("ApplicableLocationID") %>'>
                    </asp:DropDownList>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update"
                        Text="Update" Style="display: none" />
                    &nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False"
                        CommandName="Cancel" Text="Cancel" Style="display: none" />
                </td>
            </tr>
        </table>
    </EditItemTemplate>
</asp:FormView>

<asp:SqlDataSource ID="sds_Benefits" runat="server"  ConnectionString="<%$ ConnectionStrings:ConnFlexibleBenefitsDB %>"
    SelectCommand="SELECT * FROM [View_Benefits]" 
    UpdateCommand="UPDATE [Sil] SET [Code] = @Code, [HRName] = @HRName WHERE [Id] = @Id">
    <UpdateParameters>
        <asp:Parameter Name="Code" Type="String" />
        <asp:Parameter Name="HRName" Type="String" />
        <asp:Parameter Name="Id" Type="Int32" />
    </UpdateParameters>

</asp:SqlDataSource>

И это мой вид сетки:

<asp:GridView ID="grd_Benefits" runat="server" AutoGenerateColumns="False" DataKeyNames="ID"
    CssClass="gridTable" DataSourceID="sds_Benefits" OnRowCommand="grd_Benefits_RowCommand">
    <RowStyle CssClass="gridRow" />
    <FooterStyle CssClass="gridFooter" />
    <SelectedRowStyle CssClass="gridSelectedRow" />
    <HeaderStyle CssClass="gridHeader" />
    <AlternatingRowStyle CssClass="gridAlternatingRow" />
    <EmptyDataTemplate>
        No records found.
    </EmptyDataTemplate>
    <Columns>
        <asp:BoundField DataField="Code" HeaderText="Code" SortExpression="Code" />
        <asp:BoundField DataField="HRName" HeaderText="HRName" SortExpression="HRName" />
        <asp:TemplateField HeaderText="Benefit Type" SortExpression="BenefitType.Name">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Bind("BenefitTypeName") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Cost" HeaderText="Cost" SortExpression="Cost" />
        <asp:TemplateField HeaderText="Cost Type">
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" Text='<%# Bind("CostTypeName") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Quantity Type">
            <ItemTemplate>
                <asp:Label ID="Label3" runat="server" Text='<%# Bind("QuantityTypeName") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton ID="lbSelect" runat="server" CausesValidation="False" CommandName="ViewRecord"
                    Text="&lt;img border='0' alt='Edit' src='../images/zoom.gif' /&gt;" CommandArgument='<%# Container.DataItemIndex %>'></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ShowHeader="False">
            <HeaderTemplate>
                <asp:LinkButton ID="lbInsert" runat="server" CausesValidation="false" CommandName="NewRecord"
                    Text="&lt;img border='0' alt='New' src='../images/new.gif'  /&gt;" CommandArgument='<%# Container.DataItemIndex %>'
                    ForeColor="White"></asp:LinkButton>
            </HeaderTemplate>
            <ItemTemplate>
                <asp:LinkButton ID="lbEdit" runat="server" CausesValidation="False" CommandName="EditRecord"
                    Text="&lt;img border='0' alt='Edit' src='../images/edit.gif' /&gt;" CommandArgument='<%# Container.DataItemIndex %>'></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Строковая команда:

    protected void grd_Benefits_RowCommand(object sender, GridViewCommandEventArgs e)
    {            
        if (e.CommandName == "ViewRecord")
        {
            grd_Benefits.SelectedIndex = int.Parse(e.CommandArgument.ToString());
            frm_Benefit.ChangeMode(FormViewMode.ReadOnly);
            Page.ClientScript.RegisterStartupScript(this.GetType(), "ShowFormViewView", "<script type=\"text/javascript\">showFormViewView();</script>");
        }
        else if (e.CommandName == "NewRecord")
        {
            frm_Benefit.ChangeMode(FormViewMode.Insert);
            Page.ClientScript.RegisterStartupScript(this.GetType(), "ShowFormViewInsert", "<script type=\"text/javascript\">showFormViewInsert();</script>");
        }
        else if (e.CommandName == "EditRecord")
        {
            grd_Benefits.SelectedIndex = int.Parse(e.CommandArgument.ToString());
            frm_Benefit.ChangeMode(FormViewMode.Edit);
            Page.ClientScript.RegisterStartupScript(this.GetType(), "ShowFormViewEdit", "<script type=\"text/javascript\">showFormViewEdit();</script>");
        }
    }

person HOY    schedule 22.07.2013    source источник
comment
Покажите разметку GridView. Только соответствующие разделы.   -  person R.C    schedule 22.07.2013
comment
@FlopScientist, которого я добавил.   -  person HOY    schedule 22.07.2013
comment
@FlopScientist Я вставил его как есть, потому что не рискнул удалить что-то, что может вызвать проблемы. Кнопка «Редактировать» открывает представление формы выше, если вам нужно, я также могу скопировать функцию rowCommand girdview.   -  person HOY    schedule 22.07.2013


Ответы (1)


Увидев ваши разметки и приняв их как есть, проблема связана с FormView.

Вы не установили AllowPaging="true" для FormView. Таким образом, каждый раз, когда отображается FormView, он будет отображать только первую строку всех полученных записей данных.

[Обратите внимание, что представление формы отображает только одну запись за раз].

Поэтому каждый раз, когда вы выбираете «Изменить» в представлении формы, вы фактически редактируете только первую запись (которая действительно является первой строкой GridView).

Задайте для свойства AllowPaging значение true для FormView.

<asp:FormView ID="frm_Benefit" runat="server" DataKeyNames="CustomerID"
 DataSourceID="sds_Benefits" OnItemUpdated="frm_Benefit_ItemUpdated" 
AllowPaging="true">

После этого, используя индекс пейджинга, перейдите к любой записи, которую вы хотите изменить, и отредактируйте ее, как показано ниже. введите здесь описание изображения

person R.C    schedule 22.07.2013
comment
спасибо, моя ошибка заключалась в том, что я не понимал, что formview показывает первую запись, на самом деле я конвертирую чужой код, и обычно formview должен автоматически отображать элемент, по которому щелкнули, и я думаю, что у меня есть проблема с событиями щелчка где-то. Поэтому мне нужно найти его без просмотра страницы, я проверяю, почему он не работает в данный момент. - person HOY; 22.07.2013
comment
Я добавил свою команду rowcommand, если у вас есть время, можете ли вы проверить и это? В норме это должно работать. - person HOY; 22.07.2013
comment
Вы реализуете этот способ: выберите строку в GridView. Эта выбранная строка будет отображаться в FormView, которую вы потом будете редактировать? - person R.C; 22.07.2013
comment
да, это именно то, что я пытаюсь сделать. Я ищу что я упускаю, мои коды почти совпадают с рабочими кодами, но мой не работает. - person HOY; 22.07.2013