0

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

我可以使用 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>

4

1 回答 1

1

我刚刚在我的动态数据项目中模拟了您的问题。根据我的研究(和搜索),为了DynamicControl在动态数据中获取控制值(而不是来自值),您应该实施以下方法(我在我的项目中使用这种方法,我在史蒂夫博客上找到了一个,我没有记住完整链接):

/// <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;
}

现在,我的示例

首先,我的带有FormViewEntityDataSourceInsert.aspx的自定义页面:

<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然后我得到

在此处输入图像描述

于 2013-06-07T05:05:35.727 回答