我有一个使用list作为数据源的gridview,这个列表使用实体框架填充并传递给我的方法,其中这些数据被绑定到我的网格视图控件。我似乎在编辑行时遇到问题。
在设计器上我添加了网格视图的属性以具有OnRowEditing处理程序,并且我添加了一个用于编辑的按钮,但我的OnRowEditing事件处理程序未触发。断点没有击中。
我的Gridview控件
<asp:GridView runat="server"
ID="grdNotes"
OnRowCommand="grdNotes_RowCommand"
AllowPaging="true"
AllowSorting="true"
EnableTheming="true"
AutoGenerateColumns="false"
OnPageIndexChanging="grdNotes_PageIndexChanging"
OnSorting="grdNotes_Sorting"
AlternatingRowStyle-BorderColor="Yellow"
PageSize="3"
AlternatingRowStyle-BackColor="Yellow"
OnRowEditing="grdNotes_RowEditing"
OnRowDeleting="grdNotes_RowDeleting"
DataKeyNames="NotesID" >
<Columns>
<asp:BoundField HeaderText="Title" DataField="NotesTitle" SortExpression="NotesTitle">
<ItemStyle Height="20px" Width="150px" />
</asp:BoundField>
<asp:BoundField HeaderText="Text" DataField="NotesText" SortExpression="NotesText">
<ItemStyle Height="20px" Width="250px" />
</asp:BoundField>
<%-- <asp:ButtonField CommandName="EditRow" DataTextField="Edit" HeaderText="Edit" />
<asp:ButtonField CommandName="DeleteRow" DataTextField="Delete" HeaderText="Delete" />--%>
<asp:CommandField ShowEditButton="true" />
<asp:CommandField ShowDeleteButton="true" />
<asp:CommandField ShowCancelButton="true" />
</Columns>
</asp:GridView>
代码
我从Page_Init上的实体框架中检索数据。我也有全局变量
private List<NotesModel> list = new List<NotesModel>();
NotesModel nm = new NotesModel();
protected void Page_Init(object sender, EventArgs e)
{
NoteSearch ns = new NoteSearch(Business.ContextHelper.CurrentContext);
string[] urlArray = Request.RawUrl.Split('/');
string t = urlArray[4];
string[] relatedID = t.Split('=');
if (!IsPostBack)
{
// urlArray[3] is profile type , relatedID[1] is ID
list = ns.GetBasicNoteResults(nm, urlArray[3], relatedID[1]);
}
else
{
urlArray = Request.UrlReferrer.AbsoluteUri.Split('/');
t = urlArray[6];
relatedID = t.Split('=');
list = ns.GetBasicNoteResults(nm, urlArray[5], relatedID[1]);
}
GenerateGrid(list);
btnNotes.Text = "Notes: " + list.Count.ToString();
}
我的绑定方法
private void GenerateGrid(List<NotesModel> list)
{
grdNotes.DataSource = list;
grdNotes.DataBind();
int count = grdNotes.Rows.Count;
//// Hide headers we don't want to expose
//grdNotes.HeaderRow.Cells[0].Visible = false;
//grdNotes.HeaderRow.Cells[3].Visible = false;
//grdNotes.HeaderRow.Cells[4].Visible = false;
//grdNotes.HeaderRow.Cells[5].Visible = false;
//for (int i = 0; i < count; i++)
//{
// // Loop through rows and hide cells
// grdNotes.Rows[i].Cells[0].Visible = false;
// grdNotes.Rows[i].Cells[3].Visible = false;
// grdNotes.Rows[i].Cells[4].Visible = false;
// grdNotes.Rows[i].Cells[5].Visible = false;
//}
// Finally add edit/delete buttons for these click event handlers
}
我注意到的最后一件事是,当我将鼠标悬停在编辑行linkbutton上时,没有查询字符串,与我在网格底部的分页和标题相同。单击任何网格控件,用户可以:
http://localhost:8192/website/Company
而不是
http://localhost:8192/website/Company/Advertiser/?id=8879
摘要
我的gridview事件处理程序不会触发。我错过了一些让这项工作的东西吗?
答案 0 :(得分:1)
您需要移动此代码:
GenerateGrid(list);
在if(!Page.IsPostBack)
区块内。
每次页面回发到服务器时(例如,当您单击编辑按钮时),此代码正在重建您的GridView
以恢复其原始状态。这不允许RowEditing事件发生,因为你已经基本上销毁它并在Init期间重新添加它(在它有可能发生之前)。
再看一下你的代码,看来你正在使用IsPostBack
来确定网格的内容。您需要修改该逻辑才能使其正常工作。也许您可以检查传递的查询字符串的内容(或查询字符串中/
个字符的数量),以确定要传递给GetBasicNoteResults
方法的参数。
您的代码基本上如下所示:
if (!IsPostBack)
{
if (Some logic to decide what parameters to pass)
{
list = ns.GetBasicNoteResults(nm, urlArray[3], relatedID[1]);
}
else
{
list = ns.GetBasicNoteResults(nm, urlArray[5], relatedID[1]);
}
GenerateGrid(list);
}