2010-09-30 5 views
1

Это было покрыто несколько раз, без подходящего ответа:Как мне дважды привязать объект ObjectDataSource к привязке?

  1. ObjectDataSource firing twice, or on its own
  2. ObjectDataSource created twice when control is changed

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

Исследуя ссылки выше привели меня к мысли, что это может быть ошибка (или необъяснимое поведение) относительно изменения моей видимости столбца 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 перестает связывать два раза.

Я не могу думать о способе обойти это поведение.

Кто-нибудь еще видит эту проблему или разрабатывает работу?

+0

Сохраняется ли проблема, если вы прокомментируете проблемы с видимостью? – citronas

ответ

2

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

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

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

+0

Я не привязываю данные вручную. Он автоматически связывается с данными при загрузке страницы. Я не уверен, когда смогу это сделать, если я не поеду на OnInit. Кроме того, я делаю намного больше в OnDataBound, затем я показываю здесь. Я добавляю javascript и настраиваю отображение определенных полей, поэтому я не уверен, что это будет практично. – clifgriffin

+0

Я отредактировал оригинальный вопрос, чтобы включить полный код. – clifgriffin

+0

Я благодарю вас за это. Я закончил тем, что изменил свой столбец. Видимые ссылки на изменения CSS: gvContacts.Columns [3] .ItemStyle.CssClass = "visible"; Работает как шарм. Благодаря! – clifgriffin