2013-07-08 3 views
1

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

У меня есть FormView, который был создан с использованием динамических данных. Внутри этого FormView у меня есть 3 поля, ItemCosts, AdditionalCosts и TotalCosts. Я хотел бы иметь возможность добавить кнопку в форму, которая добавит ItemsCosts и AdditionalCosts вместе и отобразит ее в текстовом поле TotalCosts. Прост достаточно ... так что я подумал.

Я обнаружил, что мне нужно использовать ItemCommand, поскольку FormView использует эту команду при отправке. Это то, что я написал:

HTML

<asp:Panel ID="DetailsPanel" runat="server"> 
       <br /><br /> 
       <asp:FormView ID="FormView1" runat="server" DataSourceID="DetailsDataSource" RenderOuterTable="false" 
        OnPreRender="FormView1_PreRender" OnModeChanging="FormView1_ModeChanging" OnItemUpdated="FormView1_ItemUpdated" 
        OnItemInserted="FormView1_ItemInserted" OnItemDeleted="FormView1_ItemDeleted" OnItemCommand="FormView1_ItemCommand" OnDataBinding="FormView1_DataBind"> 
        <HeaderTemplate> 
         <table id="detailsTable" class="DDDetailsTable" cellpadding="6"> 
        </HeaderTemplate> 
        <ItemTemplate> 
        <tr class="td"> 
         <td class="DDLightHeader">Order No</td> 
         <td><asp:DynamicControl ID="OrderNo" runat="server" DataField="OrderNo" /></td> 
        </tr> 
        <tr class="td"> 
         <td class="DDLightHeader">Item Costs</td> 
         <td><asp:DynamicControl runat="server" DataField="ItemCosts" /></td> 
        </tr> 
        <tr class="td"> 
         <td class="DDLightHeader">AdditionalCosts</td> 
         <td><asp:DynamicControl runat="server" DataField="AdditionalCosts" /></td> 
        </tr> 
        <tr class="td"> 
         <td class="DDLightHeader">Total Costs</td> 
         <td><asp:DynamicControl runat="server" DataField="TotalCosts" /></td> 
        </tr> 
        <tr class="td"> 
          <td colspan="2"> 
           <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Edit" Text="Edit" /> 
           <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Delete" Text="Delete" 
            OnClientClick='return confirm("Are you sure you want to delete this item?");' /> 
</td> 
         </tr> 
        </ItemTemplate> 
        <EditItemTemplate> 
        <tr class="td"> 
         <td class="DDLightHeader">Order No</td> 
         <td><asp:DynamicControl ID="OrderNo" runat="server" DataField="OrderNo" Mode="ReadOnly"/></td> 
        </tr> 
        <tr class="td"> 
         <td class="DDLightHeader">Item Costs</td> 
         <td><asp:DynamicControl runat="server" DataField="ItemCosts" Mode="Edit" /></td> 
        </tr> 
        <tr class="td"> 
         <td class="DDLightHeader">Additional Costs</td> 
         <td><asp:DynamicControl runat="server" DataField="AdditionalCosts" Mode="Edit" /></td> 
        </tr> 
        <tr class="td"> 
         <td class="DDLightHeader">Total Costs</td> 
         <td><asp:DynamicControl runat="server" DataField="TotalCosts" Mode="Edit" /></td> 
         <td><asp:Button runat="server" ID="btnCalculateTotalCosts" Text="Calculate total costs" CommandName="Calculate" /></td> 
        </tr>      
        <tr class="td"> 
         <td class="DDLightHeader">View Items</td> 
         <td><asp:DynamicControl runat="server" DataField="tblCateringOrdersDetailsItems" Mode="Edit" /></td> 
        </tr> 
         <tr class="td"> 
          <td colspan="2"> 
           <asp:LinkButton ID="LinkButton4" runat="server" CommandName="Update" Text="Update" /> 
           <asp:LinkButton ID="LinkButton5" runat="server" CommandName="Cancel" Text="Cancel" CausesValidation="false" /> 
          </td> 
         </tr> 
        </EditItemTemplate> 
        <InsertItemTemplate> 
         <asp:DynamicEntity ID="DynamicEntity3" runat="server" Mode="Insert" /> 
         <tr class="td"> 
          <td colspan="2"> 
           <asp:LinkButton ID="LinkButton6" runat="server" CommandName="Insert" Text="Insert" /> 
           <asp:LinkButton ID="LinkButton7" runat="server" CommandName="Cancel" Text="Cancel" CausesValidation="false" /> 
          </td> 
         </tr> 
        </InsertItemTemplate> 
        <FooterTemplate> 
         </table> 
        </FooterTemplate> 
       </asp:FormView> 

       <asp:EntityDataSource ID="DetailsDataSource" runat="server" EnableDelete="true" EnableInsert="true" EnableUpdate="true" /> 

       <asp:QueryExtender ID="QueryExtender1" TargetControlID="DetailsDataSource" runat="server"> 
        <asp:ControlFilterExpression ControlID="GridView1" /> 
       </asp:QueryExtender> 
      </asp:Panel> 

Я добавил кнопку btnCalculateTotalCosts в разделе EditTemplate.

В коде позади я создал элемент управления ItemCommand

protected void FormView1_ItemCommand(object sender, FormViewCommandEventArgs e) 
     { 
      if (e.CommandName == "Calculate") 
      { 
       FormViewRow row = FormView1.Row; 
       decimal itemCosts; 
       decimal additionalCosts; 

       TextBox itemsCostTextBox = (TextBox)row.FindControl("ItemCosts"); 
       TextBox additionalCostsTextBox = (TextBox)row.FindControl("AdditionalCosts"); 
       TextBox totalCostsTextBox = (TextBox)row.FindControl("TotalCosts"); 

       Decimal.TryParse(itemsCostTextBox.Text, out itemCosts); 
       Decimal.TryParse(additionalCostsTextBox.Text, out additionalCosts); 

       totalCostsTextBox.Text = (itemCosts + additionalCosts).ToString(); 
} 

Но я получаю сообщение «Объект ссылки ошибка не указывает на экземпляр объекта». Я читал, что вы должны связать поля к FormView первым, поэтому я попытался создать следующий

protected void FormView1_DataBind(object sender, EventArgs e) 
     { 
      if (FormView1.CurrentMode == FormViewMode.Edit) 
      { 
       TextBox itemsCostTextBox = (TextBox)FormView1.FindControl("ItemCosts"); 
       TextBox additionalCostsTextBox = (TextBox)FormView1.FindControl("AdditionalCosts"); 
       TextBox totalCostsTextBox = (TextBox)FormView1.FindControl("TotalCosts"); 
      } 
     } 

и ссылки на DataBind в теге как OnDataBinding = «FormView1_DataBind», но это не сработало и Я получаю ту же ошибку.

Я действительно попытался это исправить и понял, что FindControl не видит поля в FormView, но я просто не могу понять, как это сделать.

Любая помощь будет принята с благодарностью Спасибо

+0

http://stackoverflow.com/questions/7824316/asp-net-accessing-child-controls-in-a-formview-control, казалось бы, очень похожий вопрос. http://forums.asp.net/t/1421731.aspx также может быть полезной ссылкой для рассмотрения. –

ответ

0

FindControl() получает ID для управления вы ищете. Из кода ASPX, который вы опубликовали, я не вижу, что вы устанавливаете свойство ID для DynamicControl s, которое вы пытаетесь найти, используя FindControl(). Этот призыв к этому методу:

TextBox itemsCostTextBox = (TextBox)row.FindControl("ItemCosts"); 

проходит значение DataField свойства вместо ID. Добавьте ID недвижимость для всех DynamicControl s, которую вы хотите найти.

Также учтите, что FindControl() не выполняет рекурсивный поиск, он ищет только элемент управления с указанным ID между дочерними элементами управления.

+0

Большое вам спасибо juan.facorro. Мне не приходило в голову, что идентификатор отсутствует. Теперь я добавил идентификатор, но теперь получаю следующую ошибку: «Невозможно передать объект типа« System.Web.DynamicData.DynamicControl »для ввода« System.Web.UI.WebControls.TextBox ». У вас есть какие-либо советы по этому поводу? Все примеры, которые я прочитал, похоже, предлагают мне сделать это так, как у меня в моем примере. Еще раз спасибо. Очень признателен. – user2560913

+0

Элементы управления, которые вы объявляете в ASPX, являются 'DynamicControl', поэтому приведение должно быть в этом типе. Я не уверен, как примеры, которые вы видели, обрабатывают 'DynamicControl', но есть некоторая несовместимость в том, как вы объявляете свои элементы управления и как вы хотите обрабатывать их в' ItemCommand'. –

0

В случае это помогает кто-то еще:

protected void FormView1_ItemCommand(object sender, FormViewCommandEventArgs e) 
    { 
     if (e.CommandName == "Calculate") 
     { 
      // ...    
      //instead of this... 
      TextBox itemsCostTextBox = (TextBox)row.FindControl("ItemCosts"); 
      //(no need to use row here, just use the reference to the FormView; 
      //also no need to add an ID to DynamicControl because it creates 
      //its own ID out of the field name and template control name) 

      //cast like this... 
      var itemsCostTextBox = (TextBox)FormView1.FindFieldTemplate("ItemCosts").TemplateControl.FindControl("txtTextBox1"); 
      //txtTextBox1 is the name of the specific web UI control inside of 
      //the DynamicData *.ascx template that you want access to 
     } 
    }