如何在ASP.Net动态数据自定义字段模板中检索控件的值?

时间:2013-06-05 20:36:14

标签: asp.net asp.net-dynamic-data

长话短说,对于一个旧项目,我使用ASP.Net动态数据,可能用它做了一个糟糕的工作。其中一个字段模板中有多个控件,现在我需要从FormView的Submit事件中获取一个控件的值,因为我们更改了存储值的方式。

我可以使用FindFieldTemplate找到字段模板本身...但我无法弄清楚如何进入模板内部的控件。

如果不重新设计整个事物来拉出那个字段,我怎么能这样做呢?重新设计它可能更为正确,但这是一个快速修复的网站将在几个月内被废弃。

编辑:被要求显示代码,所以在这里。 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>

1 个答案:

答案 0 :(得分:1)

我刚刚在动态数据项目中模拟了您的问题。基于我的研究(和搜索),为了获得动态数据中的控制值(而不是来自DynamicControl值),您应该实现以下方法(我在我的项目中使用此方法,我在{{{ 3}},我不记得完整的链接):

/// <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,例如, 13 ,然后我得到

enter image description here