2013-06-05 2 views
0

Короче говоря, для старого проекта я использовал динамические данные ASP.Net и, вероятно, сделал с ним ужасную работу. В одном из шаблонов полей есть несколько элементов управления, и теперь мне нужно получить значение одного элемента управления из события отправки FormView, потому что мы изменили способ сохранения этого значения.Как я могу получить значение элемента управления в шаблоне пользовательского поля ASP.Net Dynamic Data?

Я могу найти сам шаблон поля, используя FindFieldTemplate ... но я не могу понять, как добраться до элементов управления внутри шаблона.

Как я могу это сделать, не переделывая все это, чтобы вытащить это одно поле? Вероятно, было бы правильнее реорганизовать его, но это быстрое решение для веб-сайта, который будет отменен через пару месяцев.

EDIT: Просили показать код так, как он есть. FormView довольно стандартный, просто использует. У шаблона поля фактически есть свой собственный список, и я контролирую его режим в коде. Но мне нужно получить значение txtTitle.

Ticket_TicketMemo.ascx:

<asp:ListView ID="lvTicketMemos" DataSourceID="ldsTicketMemo" 
      InsertItemPosition="FirstItem" OnLoad="lvTicketMemo_Load" runat="server"> 
<LayoutTemplate> 
    <div style="overflow:auto; height:125px; width:600px;"> 
     <table class="ListViewTable" runat="server"> 
      <tr id="itemPlaceHolder" runat="server" /> 
     </table> 
    </div> 
</LayoutTemplate> 
<ItemTemplate> 
    <tr valign="top" class='<%# Container.DataItemIndex % 2 == 0 ? "" : "Alternate" %>'> 
     <td><asp:DynamicControl ID="dcType" DataField="Type" runat="server" /></td> 
     <td><asp:DynamicControl ID="dcMemo" DataField="Memo" runat="server" /></td> 
     <td><asp:DynamicControl ID="dcCreateTime" DataField="CreateTime" runat="server" /></td> 
    </tr> 
</ItemTemplate>  
<InsertItemTemplate> 
    <tr valign="top"> 
     <td colspan="3"> 
      <asp:TextBox ID="txtTitle" Width="99%" Visible="false" OnLoad="txtTitle_Load" runat="server" /><br /><br /> 
     </td> 
    </tr> 
    <tr valign="top"> 
     <td colspan="3" width="600px"> 
      <asp:TextBox ID="txtMemo" Text='<%# Bind("Memo") %>' Width="99%" OnLoad="txtMemo_Load" TextMode="MultiLine" 
          Rows="5" runat="server" /> 
          <asp:RequiredFieldValidator ID="rfvMemo" Text="Must enter notes" ControlToValidate="txtMemo" runat="server" /> 
     </td>    
    </tr> 
</InsertItemTemplate> 

+0

Не могли бы вы опубликовать код с 'FormView' и вашего шаблона поля с элементами управления для ясности. – Konstantin

ответ

1

Я просто моделируется вашу проблему в моем проекте Dynamic Data. Основываясь на моих исследованиях (и поиске), чтобы получить контрольное значение (не от DynamicControl), в Dynamic Data вы должны реализовать следующий метод (я использую этот метод в своем проекте, и я нашел его на Steve blog, я не помните, полная ссылка):

/// <summary> 
/// Get the control by searching recursively for it. 
/// </summary> 
/// <param name="Root">The control to start the search at.</param> 
/// <param name="Id">The ID of the control to find</param> 
/// <returns>The control the was found or NULL if not found</returns> 
public static Control FindControlRecursive(this Control Root, string Id) 
{ 
    if (Root.ClientID.IndexOf(Id) > 0) 
     return Root; 


    foreach (Control Ctl in Root.Controls) 
    { 
     Control FoundCtl = FindControlRecursive(Ctl, Id); 


     if (FoundCtl != null) 
      return FoundCtl; 
    } 
    return null; 
} 

Теперь, мой Пример.

Во-первых, мой пользовательский Insert.aspx страницу с FormView и EntityDataSource:

<asp:FormView runat="server" ID="FormView1" DataSourceID="DetailsDataSource" DefaultMode="Insert" 
    OnItemCommand="FormView1_ItemCommand" RenderOuterTable="false"> 
    <InsertItemTemplate> 
     <table> 
      <tr valign="top"> 
       <td colspan="3"> 
        <asp:TextBox ID="txtTitle" Width="99%" Visible="true" runat="server" /><br /> 
        <br /> 
       </td> 
      </tr> 
     </table> 
    </InsertItemTemplate> 
</asp:FormView> 
<asp:EntityDataSource ID="DetailsDataSource" runat="server" EnableInsert="true" OnInserted="DetailsDataSource_Inserted" /> 

Затем Поставлен событие EntityDataSource:

protected MetaTable table; 
protected void DetailsDataSource_Inserted(object sender, EntityDataSourceChangedEventArgs e) 
{ 
    if (e.Exception == null || e.ExceptionHandled) 
    { 
      string strTitle = String.Empty; 
      Control CtlTitle = FormView1.FindControlRecursive("txtTitle"); 
      if (CtlTitle != null) 
      { 
       TextBox TextBoxTitle = (TextBox)CtlTitle; 
       strTitle = TextBoxTitle.Text; 
      } 

      Response.Redirect(table.ListActionPath + "?" + "Department_Id=" + strTitle); 
    } 
} 

Наконец, я введите текст в txtTitle, например, , а затем я получаю

enter image description here