我在使用 asp.net 时遇到了一个奇怪的问题
GridView
。我有 GridView
绑定到 LinqDataSource
。在 GridView
的行删除事件中,我从数据库中删除该行,但网格未刷新(即使在绑定到数据源之后)。
当我设置断点时,我可以看到
OnRowDeleting
事件在 LinqDS_Selecting
事件之后被触发。但在删除事件后它不会再次被触发!难道是这个原因吗?我做错了什么?
有人可以帮忙吗?非常感谢。
.aspx 文件:
<asp:LinqDataSource
ID="LinqDS"
runat="server"
OnSelecting="LinqDS_Selecting">
</asp:LinqDataSource>
<asp:GridView
DataSourceID = "LinqDS"
ID = "gv1"
runat = "server"
DataKeyNames = "InstructionId"
EnableViewState = "false"
OnRowDataBound = "gv1_RowDataBound"
OnRowDeleting = "gv1_RowDeleting"
OnRowCommand = "gv1_RowCommand"
PageSize = "30" >
<Columns>
<!-- My colums --->
</Columns>
</asp:GridView>
.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
}
protected void LinqDS_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
// my linq to sql query
var query = from .... .... ;
e.Result = query;
}
protected void gv1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
int instructionId = (int)gv1.DataKeys[e.RowIndex].Value;
/// my delete logic
CTX.SubmitChanges();
gv1.DataBind();
}
如果您的记录实际上被正确删除,并且网格只是没有显示更改,我会尝试将 GridView 放入 UpdatePanel 中,看看这是否有帮助。
<asp:UpdatePanel runat="server" UpdateMode="Always">
<ContentTemplate>
// GridView
</ContentTemplate>
</asp:UpdatePanel>
我无法指出您的代码中的错误,但我向您提供了我删除数据的代码。
<asp:GridView ID="GridView1" runat="server" OnRowDeleting="Del" DataKeyNames="Clg_ID" BackColor="#DEBA84"
BorderColor="#DEBA84" BorderStyle="None" BorderWidth="1px" CellPadding="3"
CellSpacing="2">
<Columns>
<asp:CommandField ShowDeleteButton="True" />
</Columns>
<FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
<HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" />
<PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
<RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
<SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
<SortedAscendingCellStyle BackColor="#FFF1D4" />
<SortedAscendingHeaderStyle BackColor="#B95C30" />
<SortedDescendingCellStyle BackColor="#F1E5CE" />
<SortedDescendingHeaderStyle BackColor="#93451F" />
</asp:GridView>
.cs 文件
protected void Del(object sender, GridViewDeleteEventArgs e)
{
string i = GridView1.DataKeys[0].Value.ToString();
SqlConnection cn = new SqlConnection();
cn.ConnectionString = ConfigurationManager.ConnectionStrings["cn"].ConnectionString.ToString();
cn.Open();
SqlCommand cmd = new SqlCommand("Delete from Feedback where Clg_ID='" + i + "'", cn);
cmd.ExecuteNonQuery();
cmd.Dispose();
cn.Close();
Response.Redirect("MFeedback.aspx");
}
尝试在 GridView 的
EditIndex
方法上将 GridView 的 ItemDeleting
设置为 -1 :
protected void gv1_RowDeleting(object sender, GridViewDeleteEventArgs e) {
gv1.EditIndex = -1;
gv1.DataBind();
}
并将删除逻辑移至 GridView 的
RowCommand
方法:
protected void gv1_RowCommand(object sender, GridViewDeleteEventArgs e) {
If (e.CommandName == "Delete") {
int instructionId = (int) gv1.DataKeys[e.RowIndex].Value;
/// my delete logic
CTX.SubmitChanges();
}
}
您对删除操作的控制应该类似于:
<asp:LinkButton ID="lbDel" runat="server" Text="Delete" CommandName="Delete" />
我通常在 ObjectDataSource 上指定“DeleteMethod”(在您的情况下为 LinqDataSource)。
<asp:ObjectDataSource ID="odsInsurerGroupAssignedLogins" runat="server" OldValuesParameterFormatString="{0}"
TypeName="acg.BusinessLogic.InsurerGroupAssignedLogins"
SelectMethod="GetInsurerGroupAssignedLogins"
DeleteMethod="Delete"
EnablePaging="true"
StartRowIndexParameterName="startRowIndex"
MaximumRowsParameterName="maximumRows"
SelectCountMethod="GetInsurerGroupAssignedLogins_RowCount"
SortParameterName="sortExpression">
<SelectParameters>
<asp:ControlParameter Name="insuranceCompanyGroupID" ControlID="ddlInsuranceCompanyGroupID" PropertyName="Text" Type="Int32" />
<asp:ControlParameter Name="loginID" ControlID="ddlLoginID" PropertyName="Text" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
这是删除按钮。
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:ImageButton ID="btnDelete" ImageAlign="Middle" runat="server" ImageUrl="~/MediaFiles/DeleteOut.png"
AlternateText="Delete" CommandName="Delete" CausesValidation="false" ValidationGroup="Error"
OnClientClick="return confirm('Are you sure you want to delete this record?');" CssClass="btnDelete" />
</ItemTemplate>
<ItemStyle CssClass="LastCol" />
</asp:TemplateField>