更新行时获取DataField值(asp GridView)asp.NET C#

时间:2015-02-25 11:02:50

标签: c# asp.net gridview

我的.aspx文件中有一个GridView控件,由我的表填充( ID 姓氏):

<asp:GridView 
    ID="gridView_1" 
    runat="server"
    AutoGenerateColumns="False" <!-- used to customize my columns -->
    DataKeyNames="Id" 
    DataSourceID="sqlDataSource_1"
    OnRowUpdating="gridView_rolesTiers_RowUpdating">

    <Columns>
    <asp:BoundField 
        DataField="dbColumn_db" 
        HeaderText="Id" 
        InsertVisible="False" 
        ReadOnly="True" />
    <asp:BoundField 
        DataField="dbColumn_Surname" 
        HeaderText="Surname" 
        SortExpression="RLT_Intitule">
    <asp:CommandField 
        ShowEditButton="True" />
</Columns>
</asp:GridView>

我有一个关联的SqlDataSource,它允许我使用存储过程来显示我的 Surnames

<asp:SqlDataSource 
    ID="sqlDataSource_1" 
    runat="server" 
    ConnectionString="<%$ ConnectionStrings:myConString %>"
    SelectCommand="procedure_Select_surnames"
    SelectCommandType="StoredProcedure">
</asp:SqlDataSource>

GridView控件完美展示了我想要展示的内容。

问题:现在,如何在不离开当前页面的情况下通过存储过程更新行?

1 个答案:

答案 0 :(得分:0)

我发现这个问题的答案不是我预期的那个,或者是如此复杂以至于需要改变我GridView的结构。

对于那些搜索使用存储过程更新行的简单方法的人来说,这是一个快速解决方案:

第1步

GridView控件中添加CommandField以允许用户更新行。此CommandField必须放入<Columns> <!-- here --> </Columns>标记:

<asp:GridView 
        ID="gridView_1" 
        runat="server"
        AutoGenerateColumns="False" <!-- used to customize my columns -->
        DataKeyNames="Id" 
        DataSourceID="sqlDataSource_1"
        OnRowUpdating="gridView_rolesTiers_RowUpdating">

        <Columns>
            <!-- your precedent rows -->
            <asp:CommandField ShowEditButton="True" />
        </Columns>
        <!-- nexts attributes -->
</asp:GridView>

第2步

添加事件处理程序OnRowUpdating,当您按下按钮&#34;更新&#34;但在用户验证更新之前:

<asp:GridView 
            ID="gridView_1"
            <!-- others parameters -->
            OnRowUpdating="gridView_1_RowUpdating" />
    <!-- ... -->
</asp:GridView>

第3步

您现在将更新我们刚添加的函数gridView_1_RowUpdating以获取我们需要更新的变量。以下是更新存储过程的样子:

CREATE PROCEDURE [dbo].[storedProcedure_Update_Surnames]
        @id        int
    ,   @surname   varchar(50)
AS
        UPDATE     [dbo].[table_Surnames]
        SET        dbColumn_Surname = @surname
        WHERE      dbColumn_Id = @id 
RETURN 0

以下是gridView_1_RowUpdating方法的内容:

protected void gridView_1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    string surname = e.NewValues[0].ToString(); /* NewValues is the key */

    string id = gridView_1.DataKeys[e.RowIndex].Values[0].ToString(); /* get the id */

    sqlDataSource_1.UpdateCommand = "[storedProcedure_Update_Surnames] " + id + ", '" + surname +"'"; 
}  

解释:

当您点击&#34;更新&#34;时,所有字段而不是密钥都变为textBox。这些textBox包含您编辑的字段的新(或非)值。

所有这些值都存储在数组NewValues []中。您可以使用每个textBox更新的索引访问这些数据(从左到右为索引顺序,从0到n)。

要完成,我通过使用我需要的值正确填充参数来使用存储过程,并通过触发存储过程的行为自动更新该行。

希望对那些需要执行此类过程的人有所帮助。