Как asp.net анализирует GridView? - PullRequest
1 голос
/ 15 июля 2010

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

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

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

Ответы [ 3 ]

1 голос
/ 15 июля 2010

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

Обычно, если у вас есть общие данные типа поиска, которые вы хотите связать в режиме редактирования, я загружаю их в 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 голосов
/ 15 июля 2010

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

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

Если это не вариант, то вы можете привязать событие RowDataBound.Пример на 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 Framework.Когда все сводится к этому, мне нравится последний способ, когда я не могу использовать ObjectDataSource, но мне также приходится кодировать до уровня приемлемости других разработчиков.: D

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

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

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

0 голосов
/ 15 июля 2010

Попробуйте настроить сетку, используя 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...