2011-01-20 3 views
0

Прикрепление кода ниже - его простой код, который просто инициализирует выпадающий список (вызывается ddl.Clear()) и добавляет элемент с текстом «select», который имеет значение « -1" .Событие Gridview OnRowCreated запускается несколько раз - dropdownlist дважды заполняется

Filldropdowns (ddl) - это методы, которые получают конкретные данные и заполняют их в раскрывающемся списке. Методы индивидуально работают отлично вне gridview на обычных dropdownlists.

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

Кто-нибудь знает, почему это происходит? Отключение appenddatabounditems не является вариантом, потому что мне нужны элементы, которые будут добавлены ниже «select».

Странно, когда я отлаживаю, даже во второй раз вызываю для той же строки, он показывает, что выпадающие значения содержат нулевые элементы, а затем содержат необходимое количество элементов. Но к тому моменту, когда я дойду до grdAccountsMapping_DataBound(), он дважды отобразит количество элементов.

public void grdAccountsMapping_RowCreated(object sender, GridViewRowEventArgs e) 
{ 
    GridViewRow row = e.Row; 

    if (row.RowType == DataControlRowType.DataRow) 
    { 
     DropDownList ddlGrdFeeFormat = (DropDownList)row.FindControl("ddlFeeFormat"); 
     DropDownList ddlGrdTransactionMode = (DropDownList)row.FindControl("ddlTransactionMode"); 
     DropDownList ddlGrdFeeParticular = (DropDownList)row.FindControl("ddlFeeParticular"); 
     DropDownList ddlGrdCompany = (DropDownList)row.FindControl("ddlCompany"); 
     DropDownList ddlGrdAccounts = (DropDownList)row.FindControl("ddlAccounts"); 
     DropDownList ddlGrdFeeBook = (DropDownList)row.FindControl("ddlFeeBook"); 

     InitializeDropdown(ddlGrdFeeBook); 
     InitializeDropdown(ddlGrdFeeFormat); 
     InitializeDropdown(ddlGrdTransactionMode); 
     InitializeDropdown(ddlGrdFeeParticular); 
     InitializeDropdown(ddlGrdCompany); 

     getDDLValues.FillFeeBooks(ddlGrdFeeBook); 
     getDDLValues.FillFeeFormats(ddlGrdFeeFormat); 
     getDDLValues.FillPaymentModes(ddlGrdTransactionMode); 
     getDDLValues.FillFeeParticulars(ddlGrdFeeParticular); 
     getDDLValues.FillAccountingCompanies(ddlGrdCompany); 
    } 
} 

Определение сетки ASPX страница выглядит следующим образом

<asp:GridView CssClass="Grid" ID="grdAccountsMapping" runat="server" Width="98%" 
EmptyDataText="No records found in this section" EmptyDataRowStyle-Height="40px" 
AutoGenerateColumns="False" AccessKey="2" DataKeyNames="FAM_MAP_ID" OnRowCommand="grdAccountsMapping_RowCommand" 
OnRowCreated="grdAccountsMapping_RowCreated" OnDataBound="grdAccountsMapping_DataBound" 
Visible="false"> 
<AlternatingRowStyle CssClass="alternateGridItem" HorizontalAlign="Left" /> 
<RowStyle CssClass="gridItem" HorizontalAlign="Left" /> 
<EmptyDataRowStyle CssClass="gridItem" HorizontalAlign="Center" Font-Bold="True" 
    ForeColor="Red" Height="40px" VerticalAlign="Middle" /> 
<HeaderStyle CssClass="tabledarklabel" /> 
<FooterStyle CssClass="Grid_Footer" /> 
<Columns> 
    <asp:TemplateField HeaderText="Fee Book"> 
     <ItemTemplate> 
      <asp:DropDownList ID="ddlGrdFeeBook" CssClass="dropdownwidth3" runat="server" AppendDataBoundItems="True"> 
      </asp:DropDownList> 
     </ItemTemplate> 
     <ItemStyle HorizontalAlign="Center" /> 
     <HeaderStyle Width="5%" /> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Fee Format"> 
     <ItemTemplate> 
      <asp:DropDownList ID="ddlGrdFeeFormat" CssClass="dropdownwidth3" runat="server" AppendDataBoundItems="True"> 
      </asp:DropDownList> 
     </ItemTemplate> 
     <ItemStyle HorizontalAlign="Center" /> 
     <HeaderStyle Width="5%" /> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Transaction Mode"> 
     <ItemTemplate> 
      <asp:DropDownList ID="ddlGrdTransactionMode" CssClass="dropdownwidth3" runat="server" 
       AppendDataBoundItems="True" > 
      </asp:DropDownList> 
     </ItemTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Fee Particulars"> 
     <ItemTemplate> 
      <asp:DropDownList ID="ddlGrdFeeParticular" CssClass="dropdownwidth3" runat="server" 
       AppendDataBoundItems="True"> 
      </asp:DropDownList> 
     </ItemTemplate> 
     <ItemStyle HorizontalAlign="Center" /> 
     <HeaderStyle Width="5%" /> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Company"> 
     <ItemTemplate> 
      <asp:DropDownList ID="ddlGrdCompany" CssClass="dropdownwidth3" runat="server" AppendDataBoundItems="True"> 
      </asp:DropDownList> 
     </ItemTemplate> 
     <ItemStyle HorizontalAlign="Center" /> 
     <HeaderStyle Width="5%" /> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Account"> 
     <ItemTemplate> 
      <asp:DropDownList ID="ddlGrdAccounts" CssClass="dropdownwidth3" runat="server" AppendDataBoundItems="True"> 
      </asp:DropDownList> 
     </ItemTemplate> 
     <ItemStyle HorizontalAlign="Center" /> 
     <HeaderStyle Width="5%" /> 
    </asp:TemplateField> 
    <asp:TemplateField HeaderText="Active"> 
     <ItemTemplate> 
      <asp:CheckBox ID="chkActive" runat="server" /> 
     </ItemTemplate> 
     <ItemStyle HorizontalAlign="Center" /> 
     <HeaderStyle Width="5%" /> 
    </asp:TemplateField> 
</Columns> 
<PagerSettings Visible="False" /> 
<PagerStyle BorderStyle="None" /> 
</asp:GridView> 

другие методы, используемые только извлечения набора данных для данных, необходимых, присвоить его datasourceo из выпадающего списка, а затем привязать его к DropDownList контроль. Эти методы отлично работают на выпадающих таблицах вне сетки, и я тестировал их, поэтому я уверен, что проблемы там нет.

+0

Единственная причина, по которой я мог думать, это то, что вы, возможно, подписались на RowCreated несколько раз (дважды в вашем случае), возможно, один раз в разметке и снова в коде. –

+0

Нет. Я также разместил разметку - в коде, находящемся за файлом, не происходит подписки. –

+0

Я исправил проблему прямо сейчас, используя обработчик событий RowDataBound, а не выше - там он отлично работает. Но мне все еще интересно узнать, почему это не работает. –

ответ

0

Мы просто удалили файл и создали его снова, и он, похоже, сработал. У меня не так много времени, чтобы вникать в детали, так как мы были в крайнем сроке, но эта странная проблема не повторилась!

0

Как вы связываете сетку? Вы случайно вызываете DataBind() и/или Rebind() несколько раз?

+0

Нет, его привязка только один раз. –

+0

Можете ли вы опубликовать полный код ... сложно сказать, что может происходить в зависимости от того, что находится в вашем первоначальном посте. – Cognitronic

+0

также добавил разметку сетки. –

Смежные вопросы