Asp.net gridview,在编辑模式下获取代码中的boundfield值

时间:2009-07-26 13:14:04

标签: c# asp.net gridview

在asp.net(c#)中,我正在使用gridview和编辑模式,以便用户更改值。但我需要检查用户在OnRowUpdating中输入的值,使用此代码时,我总是得到旧值而不是我输入的新值。我怎样才能获得新值?

<asp:GridView ID="MyGridView" OnRowUpdating="MyGridViewUpdate" DataKeyNames="id,value">
    <Columns>
        <asp:BoundField ReadOnly="false" DataField="value" DataFormatString="{0:0.##}" />
        <asp:CommandField ShowEditButton="true" EditImageUrl="~/images/iconedit.png" ButtonType="Image" CancelImageUrl="~/images/iconclose.png" UpdateImageUrl="~/images/iconedit.png" />
   </Columns>
</asp:GridView>

在codebehind中:

protected void MyGridViewUpdate(object sender, GridViewUpdateEventArgs e)
{
    string test = e.NewValues["value"].ToString();
    //Test always give the old value, I need the new value the user added..
}

5 个答案:

答案 0 :(得分:4)

啊,仔细看,我觉得我看到了问题:

您已将id 值添加到GridView的DataKeyNames属性,例如。 DataKeyNames="id,value"。这就像指定它们都是主键。如果您希望值可编辑,则应将其从DataKeyNames中删除。

答案 1 :(得分:2)

很奇怪,我正在使用autogenerate = false但它不能正常工作,这是我的完整代码:

<asp:SqlDataSource ID="DSValues" 
    runat="server"
    DataSourceMode="DataSet"  
    ConnectionString="..."
    ProviderName="MySql.Data.MySqlClient"
    SelectCommand="CALL spValues();" 
    UpdateCommand="UPDATE table SET value=?value WHERE id=?id;">
</asp:SqlDataSource>

<asp:GridView ID="MyGridView" OnRowUpdating="MyGridViewUpdate" DataKeyNames="id,value" DataSourceID="DSValues" AutoGenerateColumns="false">
<Columns>
    <asp:BoundField ReadOnly="false" DataField="value" DataFormatString="{0:0.##}" />
    <asp:CommandField ShowEditButton="true" EditImageUrl="~/images/iconedit.png" ButtonType="Image" CancelImageUrl="~/images/iconclose.png" UpdateImageUrl="~/images/iconedit.png" />
</Columns>
</asp:GridView>

//SpValues() is a stored procedure that just do: "SELECT id,value FROM table"

这有效:

(MyGridView.Rows[e.RowIndex].Cells[1].Controls[0] as TextBox).Text 

我可以使用它,但知道如何使用“NewValues”会很好......

答案 2 :(得分:1)

尝试使用OnRowUpdated事件。在网格更新行之前引发OnRowUpdating。网格更新行后会引发OnRowUpdated

答案 3 :(得分:1)

我刚刚使用GridView和SqlDataSource进行了快速测试,e.NewValues["value"]为我提供了新值,正如预期的那样。就你发布的代码而言,你所做的是正确的。

我唯一能想到的是你在使用BoundFields时没有在GridView上设置AutoGenerateColumns="false"。如果不设置它,您将获得两组列 - BoundFields和生成的列。这将导致冲突,因为您将发送两个具有相同名称的列。

如果不是问题,则需要发布更多代码。

答案 4 :(得分:-2)

<asp:GridView id="gvDiagnostics" runat="server" 
         AllowPaging="True" AutoGenerateColumns="False"
         BackColor="White" BorderColor="#DEDFDE" 
         BorderStyle="None" BorderWidth="1px"
         CellPadding="4" CssClass="label" ForeColor="Black"
         GridLines="Vertical" Width="100%"  
         DataKeyNames="SNo">
  <footerstyle backcolor="#CCCC99" />
  <columns>
    <asp:BoundField DataField="SNo" HeaderText="SNo">
      <ItemStyle HorizontalAlign="Left" VerticalAlign="Middle"></ItemStyle>
      <HeaderStyle HorizontalAlign="Left" VerticalAlign="Middle"></HeaderStyle>
    </asp:BoundField>
    <%--<asp:BoundField DataField="ProductId" SortExpression="ProductId" HeaderText="S.No"></asp:BoundField>--%>
    <asp:TemplateField SortExpression="Code" HeaderText="Code">
      <EditItemTemplate>
        <asp:TextBox runat="server" Text='<%# Bind("Code") %>' id="TextBox1"></asp:TextBox>
      </EditItemTemplate>
      <ItemTemplate>
        <asp:LinkButton id="lbtnCode" runat="server" Text='<%# Eval("Code") %>'   OnClick="lbtnSNo_Click"></asp:LinkButton>
      </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField DataField="ShortList" SortExpression="ShortList" HeaderText="ShortList"></asp:BoundField>
    <asp:BoundField DataField="Description" SortExpression="Description" HeaderText="Description"></asp:BoundField>
  </columns>
  <rowstyle backcolor="#F7F7DE" />
  <emptydatatemplate>
    <asp:LinkButton id="lbtnProductId" runat="server" Text='<%# Eval("ProductCategory") %>'></asp:LinkButton>
  </emptydatatemplate>
  <selectedrowstyle backcolor="#C04000" font-bold="True" forecolor="White" />
  <pagerstyle backcolor="#F7F7DE" forecolor="Black" horizontalalign="Right" />
  <headerstyle backcolor="#6B696B" font-bold="True" forecolor="White" />
  <alternatingrowstyle backcolor="White" />
</asp:GridView>