Как мне остановить привязку моего ObjectDataSource дважды? - PullRequest
1 голос
/ 30 сентября 2010

Это уже пару раз освещалось без подходящего ответа:

  1. ObjectDataSource запускается дважды или самостоятельно
  2. ObjectDataSource создается дважды при изменении элемента управления

Я создал пользовательский класс данных подкачки, который используется с ObjectDataSource. В начальных тестах я обнаружил, что он работает хуже, чем мой старый код SqlDataSource. В ходе исследования я обнаружил, что для каждой загрузки страницы объектDataSource создается и связывается дважды.

Исследование приведенных выше ссылок привело меня к выводу, что это может быть ошибкой (или необъяснимым поведением) в отношении изменения видимости столбца моего GridView в событии OnDataBound, например, так:

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 Ответ

2 голосов
/ 30 сентября 2010

Почему вы хотите изменить видимость столбцов в событии RowDataBound? Это событие будет вызываться для каждого элемента, который вы связываете.

Скрыть столбцы перед тем, как вы на самом деле выполните вызов DataBind () в GridView.

Если это вам не поможет, вам нужно будет предоставить код, который вы используете для привязки данных.

...