在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..
}
答案 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>