GridView编辑按钮删除行

时间:2014-02-04 15:17:49

标签: sql .net gridview edit

我正在努力创建一个替换前端,用于修改我们的一个用户维护的几个数据库表。使用此界面维护的表格为我和我的队友创建的其他应用程序提供数据。

在使用当前使用的前端时,维护此数据的用户有时会在给定CorpNum的CorpName上创建包含多个排列的数据行(通过拼写错误,包括不同的,附加的CorpName字段中的信息等)。这导致我们的应用程序向同一公司查询向我们的用户提供多项选择的数据,这通常令人困惑。

因此,我希望为维护此数据的用户提供修改拼写错误或修改某些CorpNames的能力,以便每个CorpNum只有一个相应的CorpName与之关联。

我正在使用的一个控件是一个GridView控件,我绑定到一个sql数据源,其Select命令如下:

从CorpNum asc中选择不同的CorpNum,CorpName从TableName订单

我已将此GridView排序(按请求),并且我还在GridView的最左侧列中放置了一个Edit按钮。此Edit操作的Update命令是以下存储过程:

UPDATE TableName SET CorpName = @CorpName WHERE CorpNum = @CorpNum

我看到的奇怪行为如下:

当我单击“编辑”按钮以获取可能与GridView控件中的另一行具有相同CorpNum的行时,该行将自动从GridView和数据库表中删除(我正在使用副本进行测试,所以那里没有真正的威胁)。我可以看到这样的事情发生,如果我是,实际上编辑单元格的内容,使我选择的行的CorpName与具有相同CorpNum的不同行的CorpName相同(作为结果的输出) distinct select会删除一行),但我没有改变任何东西,也没有点击Update按钮。这就是我觉得奇怪的事情。

有什么想法?当然,请随时要求任何澄清等。

SqlDataSource标记位于下方。

    <asp:SqlDataSource ID="sdsCorporationInfo" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ConnString %>
    SelectCommand="select distinct CorpNum,CorpName from Distribution_xx order by CorpNum asc"
    onselecting="sdsCorporationInfo_Selecting" 
    UpdateCommand="sp_XXUpdateCorporationInfo" 
    UpdateCommandType="StoredProcedure">
    <UpdateParameters>
    <asp:Parameter Name="CorpNum" Type="Decimal" />
    <asp:Parameter Name="CorpName" Type="String" />
    </UpdateParameters>
    </asp:SqlDataSource>

更新存储过程代码在此处:

        PROCEDURE [dbo].[sp_XXUpdateCorporationInfo] 
        @CorpNum numeric,
        @CorpName varchar(40)
        AS
        UPDATE Distribution_xx SET CorpName = @CorpName WHERE CorpNum = @CorpNum

GridView标记在这里:

    <asp:GridView ID="gvCorporationInfo" runat="server"  AutoGenerateColumns="False" 
    DataSourceID="sdsCorporationInfo" Visible="False"
    AllowSorting="True" AutoGenerateEditButton="True"
    onrowediting="gvCorporationInfo_RowEdit"
    onrowupdated="gvCorporationInfo_RowUpdate"
    onrowupdating="gvCorporationInfo_RowUpdating"
    <Columns>
    <asp:TemplateField HeaderText="Corp #" SortExpression="CorpNum">
    <EditItemTemplate>
    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("CorpNum") %>'></asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
    <asp:Label ID="Label1" runat="server" Text='<%# Bind("CorpNum") %>'></asp:Label>
    </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Corp Name" SortExpression="CorpName">
    <EditItemTemplate>
    <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("CorpName") %>'></asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
    <asp:Label ID="Label2" runat="server" Text='<%# Bind("CorpName") %>'></asp:Label>
    </ItemTemplate>
    </asp:TemplateField>
    </Columns>
    </asp:GridView>

以下代码中的事件(那里没有太多):

    protected void gvCorporationInfo_Sorting(object sender, GridViewSortEventArgs e)
    {
        gvCorporationInfo.DataBind();
    }
    protected void gvCorporationInfo_RowEdit(object sender, GridViewEditEventArgs e)
    {
        gvCorporationInfo.UpdateRow(e.NewEditIndex, true);
    }

运行时GridView内容的概念如下:

            Corp #  Corp Name
    Edit    33  Corp Name 1
    Edit    37  Corp Name 2
    Edit    48  Corp Name 3
    Edit    48  Corp Name Three
    Edit    51  Corp Name 4
    Edit    53  Corp Name 5
    Edit    56  Corp Name 6
    Edit    57  Corp Name 7
    Edit    60  Corp Name 8
    Edit    61  Corp Name 9
    Edit    63  Corp Name 10
    Edit    64  Corp Name 11
    Edit    65  Corp Name 12
    Edit    66  Corp Name 13
    Edit    68  Corp Name 14
    Edit    70  Corp Name 15
    Edit    71  Corp Name 16
    Edit    71  Corp Name Sixteen

TIA

1 个答案:

答案 0 :(得分:0)

尝试尝试以下内容。

ASP标记,请注意为了引用代码隐藏中的事件而添加的onrowediting。此外,在列中,第一个是CommandField按钮。自动生成编辑将替换为此,因此所选行可以使用代码隐藏事件。这对我有用,我希望它有用。如果没有别的,也许它会激发一些可以帮助你的想法。再一次,DO运行探查器以查看发送到SQL服务器的内容。这是找到数据不匹配和奇数位的好方法,可以给您带来麻烦。它可能是非常小的东西,这将有助于你发现它。

<asp:GridView ID="gvCorporationInfo" runat="server" AutoGenerateColumns="False" DataSourceID="sdsCorporationInfo"
    onselectedindexchanged="gvCorporationInfo_SelectedIndexChanged" 
    DataKeyNames="CorpNum" onrowdatabound="Grid_OnRowDataBound" 
    onrowediting="gvCorporationInfo_RowEditing" >
    <Columns>
        <asp:CommandField ShowEditButton="True" ButtonType="Button" EditText="  Edit  " />
<asp:BoundField>...all your boundfields here

ASP数据源连接

<asp:SqlDataSource ID="sdsCorporationInfo" runat="server" 
ConnectionString="<%$ ConnectionStrings:ConnString %>
SelectCommand="select distinct CorpNum,CorpName from Distribution_xx order by CorpNum asc"
onselecting="sdsCorporationInfo_Selecting" 

<UpdateParameters>
    <UpdateParameters>
        <asp:Parameter Name="CorpName" />
        <asp:Parameter Name="CorpNum" />
    </UpdateParameters>
</asp:SqlDataSource>

在你的代码隐藏中

    protected void gvCorporationInfo_RowEditing(object sender, GridViewEditEventArgs e)
{
    string connectionstring = WebConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
    SqlConnection con = new SqlConnection();
    con.ConnectionString = connectionstring;
    SqlCommand cmd = new SqlCommand();

    cmd = new SqlCommand("DatabaseName.dbo.sp_XXUpdateCorporationInfo", con);

    cmd.Parameters.AddWithValue("@CorpNum", (String)gvCorporationInfo.DataKeys[e.NewEditIndex].Value);
    cmd.Parameters.AddWithValue("@CorpName", (String)gvCorporationInfo.DataKeys[e.NewEditIndex].Value);


    cmd.CommandType = CommandType.StoredProcedure;

    con.Open();
    cmd.ExecuteScalar();

    con.Close();

    gvCorporationInfo.DataBind();
}

如果我输入错误,我道歉。