GridView选定索引更改事件未触发。

3
我希望当我点击GridView行时,能够触发SelectedIndexChanged事件。我在代码后台尝试了以下操作:
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowIndex != -1)
        {
            e.Row.Attributes.Add("onMouseOver", "Highlight(this)");
            e.Row.Attributes.Add("onMouseOut", "UnHighlight(this)");

            e.Row.Attributes.Add("onClick", String.Format("javascript:__doPostBack('GridView1','Select${0}')", e.Row.RowIndex));
        }
    }

当我点击一行时,会发生Postback事件,但它不会触发SelectedIndexChanged事件。在Page_Load中,我从请求中获取参数。
        if (IsPostBack)
        {
            object obTarget = this.Request.Form["__EVENTTARGET"]; //GridView1
            object obArg = this.Request.Form["__EVENTARGUMENT"]; //Select$4
        }

我认为必须引发SelectedIndexChanged,或者我对此有误解吗?
1个回答

4
您可能正在postback时重新绑定GridView到其DataSource。您应该只在if(!IsPostBack)(启用ViewState)的情况下执行此操作,否则事件不会被触发。
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        GridView1.DatSource = GetGataSource();
        GridView1.DataBind();
    }
}

您还应该在每个回发上注册事件处理程序,但是RowDataBound仅在数据绑定时调用。因此,请改用RowCreated

最好使用Page.GetPostBackClientHyperlink而不是硬编码javascript函数。
e.Row.Attributes["onclick"] = Page.ClientScript.GetPostBackClientHyperlink((GridView)sender, "Select$" & e.Row.RowIndex) 

替换硬编码的JavaScript已经解决了问题,非常感谢。不同之处在于,__EVENTTARGET的值为“ctl00$MainContent$GridView1”,而不是硬编码版本中的“GridView1”。 - dvjanm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接