2010-07-15 2 views
1

Как asp.net анализирует GridView? Предположим, что я определил как EditItemTemplate, так и ItemTemplate. Похоже, что я не могу делать никаких данных, связанных с временем загрузки, для элементов управления, таких как dropdownlist в EditItemTemplate.Как asp.net анализирует GridView?

И верно ли, что данные будут привязаны к элементам управления в EditItemTemplate, когда активирован режим редактирования? Если нет, как связать все элементы управления во время загрузки на C#?

Спасибо, это на самом деле сводит меня с ума. Я не могу найти ничего о том, как asp.net выполняет или оценивает GridView в Интернете.

ответ

1

Вам необходимо привязать его, когда он переведен в режим редактирования. Помните, что элементы управления редактирования не существуют, пока не будет установлен режим редактирования для определенной строки. В то время элементы управления доступны для привязки.

Обычно, если у вас есть общие данные тип поиска вы хотите связать в режиме редактирования, я загрузить его в Cache, Session или ViewState (в зависимости от содержания и ситуации) в первый раз это необходимо, а затем связать его из этого «кэшируются 'для сохранения вызовов БД. Обычно я использую метод OnDataBinding для каждого элемента управления в пределах EditItemTemplate, которому требуется специальное связывание, такое как DropDownList.

В вашем ASPX:

<EditItemTemplate> 
    <asp:DropDownList ID="yourDropDownList" runat="server" 
     OnDataBinding="yourDropDownList_DataBinding"></asp:DropDownList> 
</EditItemTemplate> 

Тогда в вашем коде:

protected void yourDropDownList_DataBinding(object sender, System.EventArgs e) 
{ 
    DropDownList ddl = (DropDownList)(sender); 
    // do you databinding code here 

    // this is an example 
    ddl.DataSource = GetMyDropDownListData(); 
    ddl.DataBind(); 
    ddl.SelectedValue = Eval("FieldFromGridData"); 
} 

Я предпочитаю, чтобы связать таким образом, как это будет локализует код для конкретных элементов управления и ваши не должны идти ищет их, используя FindControl на строках и т. д.

yourDropDownList_DataBinding будет стрелять только для строки в режиме редактирования. В вашей начальной привязке, где ничего не находится в режиме редактирования, привязка данных не будет срабатывать, но каждый раз, когда вы вставляете строку в режим редактирования, она будет выполняться, поэтому я говорю, чтобы как-то кэшировать данные, которые вы хотите привязать к DropDownList, в первый раз ты понял.

0

Попробуйте установить свою сетку с помощью Eval, чтобы получить данные из источника данных gridview.

<asp:GridView ID="gv" runat="server" SkinID="gridviewSkin" AutoGenerateColumns="False" DataKeyNames="Id" 
       AutoGenerateEditButton="false" 
       OnRowEditing="GvItems_RowEditing" 
       OnRowCancelingEdit="GvItems_RowCancelingEdit" 
       OnRowUpdating="GvItems_RowUpdating" 
       OnPageIndexChanging="Gv_PageIndexChanging" 
       AllowPaging="true" 
       PageSize="20" 
     > 
    <Columns> 
     <asp:CommandField ShowEditButton="True" CausesValidation="true" /> 
     <asp:TemplateField HeaderText="Name" ItemStyle-Width="200" ItemStyle-VerticalAlign="Top"> 
      <ItemTemplate> 
       <%# Eval("Name")%> 
      </ItemTemplate> 
      <EditItemTemplate>   
       <asp:TextBox ID="txtName" runat="server" Width="200" Text='<%# Eval("Name") %>' MaxLength="50" /> 
       <asp:RequiredFieldValidator ID="rfv_txtName" runat="server" ControlToValidate="txtName" Display="Dynamic" ErrorMessage="(Required)" /> 
      </EditItemTemplate> 
     </asp:TemplateField>  
     <asp:TemplateField HeaderText="Active" ItemStyle-Width="100" ItemStyle-HorizontalAlign="Center"> 
      <ItemTemplate> 
       <asp:CheckBox ID="chkActive_Item" runat="server" Checked='<%# (bool)Eval("IsActive")%>' Enabled="false" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:CheckBox ID="chkActive_Edit" runat="server" Checked='<%# (bool)Eval("IsActive")%>' /> 
      </EditItemTemplate> 
     </asp:TemplateField>   
    </Columns> 
    <EmptyDataTemplate>No items exist</EmptyDataTemplate> 
</asp:GridView> 

Чтобы редактировать, затем

protected void GvItems_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    gv.EditIndex = e.NewEditIndex; 

    //also reload and bind the items 

} 

Для загрузки выпадающих источников данных:

 <asp:TemplateField HeaderText="Channel Type" ItemStyle-Width="200" ItemStyle-VerticalAlign="Top"> 
      <ItemTemplate> 
       <%# Eval("ChannelType.Name") %> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:DropDownList ID="ddlChannelType" runat="server" DataSource="<%# GetChannelTypeDropdownBoxDataSource() %>" DataTextField="Name" DataValueField="Id" AppendDataBoundItems="true" SelectedValue='<%# Eval("ChannelId") %>' /> 
      </EditItemTemplate> 
     </asp:TemplateField> 

И получить код для возврата источника данных:

protected ChannelType[] GetChannelTypeDropdownBoxDataSource() 
    { 
     return _channelTypeRepository.GetAll(); 
    } 
0

Есть количество вариантов привязки данных вложенных co ntrols в шаблонах GridView.

Самый простой и тот, который я использую, когда могу, - использовать ObjectDataSource и привязать к нему свой раскрывающийся список.

Если это не вариант, вы можете связать его в событии RowDataBound.example on MSDN не хватает, но если вы будете следовать этому примеру (C#), и где он говорит:

// Display the company name in italics. 
     e.Row.Cells[1].Text = "<i>" + e.Row.Cells[1].Text + "</i>"; 

Вы бы что-то вроде:

DropDownList ddlWhatever = e.Row.FindControl("ddlWhatever") as DropDownList; 
if(ddlWhatever != null) { /* bind data to it and call ddlWhatever.DataBind(); */ } 

Поскольку EditItemTemplate и InsertItemTemplate не отображаются в то же время я обычно сохраняю имена элементов управления одинаковыми в каждом шаблоне, чтобы упростить событие базы данных в коде позади. Но нет ничего, что мешало бы вам иметь ddlEditItems и ddlInsertItems и привязывать их по-разному к событию с привязкой к данным.

Еще один трюк, который я использовал ранее, является привязкой к DropDownList с событием OnInit выпадающего списка. Например:

// web form 
<asp:DropDownList id="ddlWhatever" AutoPostBack="True" 
    runat="server" OnInit="ddlWhatever_Init"> 

// Code behind 
protected void ddlWhatever_Init(object s, EventArgs a) 
{  
    object[] years = { 
    new { Year = 2009 }, new { Year = 2010 } 
    }; 
    ddlWhatever.DataSource = years; 
    ddlWhatever.DataTextField = "Year"; 
    ddlWhatever.DataValueField = "Year"; 
    ddlWhatever.DataBind(); 
} 

Я имел некоторые люди говорят мне, чтобы не делать это таким образом последний (т.е. контроль не должен быть ответственным за себя связывание). Я не согласен и не помню, чтобы видеть что-либо, связанное с этим утверждением в Руководстве по разработке дизайна Microsoft. Когда все сводится к этому, мне нравится последний способ, когда я не могу использовать ObjectDataSource, но я также должен кодировать уровень принятия решений другими разработчиками. : D

правила я обычно придерживаться:

  1. Использование ObjectDataSource, когда это быстро и легко
  2. Использование GridView RowDataBound, когда элементы вложенного элемента управления зависят от других значений в GridView
  3. Используйте OnInit, если вы просто привязываете данные, имея в виду, что вы не можете получить доступ к другим элементам управления при запуске этого метода (например, GridView еще не был инициализирован)

Надеюсь, что это поможет, я столкнулся с таким же разочарованием в связи с отсутствием примеров MSID GridView.

+0

@Jim Schubert см. Мой ответ выше, это именно то, для чего используется метод OnDataBinding, я бы не рекомендовал использовать OnInit. Использование «RowDataBound» на мой взгляд не очень хорошо, потому что оно не локализует код для самого элемента управления. Я думаю, что большинство людей делают это с помощью 'RowDataBound', потому что мало кто понимает, как использовать' OnDataBinding'. – Kelsey

+0

@ Kelsey, это справедливый аргумент, но OnDataBinding предполагает, что источник данных уже предоставлен, и 'DataBind' уже вызван. Выполняя свою привязку в этом методе, не сдвигает ли он * поток событий управления? Из MSDN: «Этот метод уведомляет серверный элемент управления о выполнении любой логики привязки данных, связанных с ним». Данные привязки в этом случае инкапсулируют связь, привязку и логику для элемента управления. –

+0

Кроме того, из MSDN относительно Control.Init: 'Контроллеры сервера должны выполнять любые шаги инициализации, необходимые для создания и настройки экземпляра.' Я думаю, что конечная точка заключается в том, что вы можете привязать элемент управления практически в любом месте. –