如何阻止我的ObjectDataSource绑定两次?

时间:2010-09-30 14:55:13

标签: c# asp.net gridview objectdatasource

这已被覆盖了几次,没有合适的答案:

  1. ObjectDataSource firing twice, or on its own
  2. ObjectDataSource created twice when control is changed
  3. 我创建了一个与ObjectDataSource一起使用的自定义分页数据类。在初始测试中,我发现它的性能比旧的SqlDataSource代码差。在调查时,我发现对于每个页面加载,都会创建ObjectDataSource并绑定两次。

    调查上面的链接让我相信这可能是一个错误(或无法解释的行为)关于在OnDataBound事件中更改我的GridView的列可见性,如下所示:

    protected void gvContacts_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType != DataControlRowType.Pager && e.Row.Cells[0].Text != gvContacts.EmptyDataText)
        {
            e.Row.Cells[0].Visible = false;
            if (Convert.ToInt16(lstSearchType.SelectedValue) == ADDRESS)
            {
                gvContacts.Columns[2].ItemStyle.Width = Unit.Percentage(30);
                gvContacts.Columns[3].Visible = true;
                gvContacts.Columns[3].ItemStyle.Width = Unit.Percentage(20);
            }
            else
            {
                gvContacts.Columns[2].ItemStyle.Width = Unit.Percentage(50);
                gvContacts.Columns[3].Visible = false;
            }
        }
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes["ID"] = "contact_" + e.Row.Cells[0].Text;
            e.Row.Attributes["onclick"] = "javascript:selectRow($(this).attr('id').replace('contact_',''),2);";
            e.Row.Attributes["ondblclick"] = "javascript:openContact($(this).attr('id').replace('contact_',''),''); selectRow($(this).attr('id').replace('contact_',''),2);";
    
            //E-mail link
            if (e.Row.Cells[4].Text != " ")
            {
                e.Row.Cells[4].Text = "<a href=\"mailto:" + e.Row.Cells[4].Text + "\">" + e.Row.Cells[4].Text + "</a>";
            }
            //Birthday highlight
            if (e.Row.Cells[6].Text != "&nbsp;")
            {
                DateTime dt = Convert.ToDateTime(e.Row.Cells[6].Text);
                DateTime now = DateTime.Now;
                if (dt.Day == now.Day && dt.Month == now.Month)
                {
                    e.Row.Cells[6].BackColor = System.Drawing.Color.FromArgb(255, 230, 160);
                }
            }
        }
    }
    

    我使用此事件来自定义某些字段的显示,以及隐藏在某些搜索类型中不适用的列。

    当我禁用该事件时,ODS会停止绑定两次。

    我真的不能想办法绕过这种行为。

    有没有其他人看到这个问题或开展了一项工作?

1 个答案:

答案 0 :(得分:2)

为什么要更改RowDataBound事件中列的可见性?将为您绑定的每个项目调用此事件。

在GridView上实际执行DataBind()调用之前隐藏列。

如果这对您没有帮助,则需要提供用于数据绑定的代码。