0

これはおそらく、私がすべて間違っている別のケースです。私は自分を責めます。

しかし、以下に示すように、DetailsView での FindControl の動作に混乱しています。

FindControl は、DataControlFieldCollection からフィールドを削除するまで機能します。問題がある場合、これは MasterPage にあります。

Page_Load、Page_PreRender、および dvCategories の ModeChanged イベントと ModeChanging イベントの DataControlField を削除するコードを移動して実験しました。

また、多くの場所から dvCategories.Databind() を呼び出してみましたが、役に立ちませんでした。

これは予期された動作ですか?回避策はありますか?

protected void ldsCategories_OnInserting(object sender, LinqDataSourceInsertEventArgs e)
{
    //Here findcontrol works unless the commented code from the button event handler is fired.
    TextBox tb = (TextBox) dvCategories.FindControl("txtInsertParentId");
    string ParentName = tb.Text;

}

protected void btnNew_click(object sender, EventArgs e)
{
    dvCategories.ChangeMode(DetailsViewMode.Insert);
    //dvCategories.Fields.RemoveAt(3);

}

ASP コード:

    <asp:DetailsView ID="dvCategories" runat="server" AutoGenerateEditButton="True" AutoGenerateInsertButton="True" DataSourceID="ldsCategories" AutoGenerateRows="False" DataKeyNames="CategoryId" DefaultMode="ReadOnly">
        <Fields>
            <asp:BoundField DataField="CategoryId" HeaderText="CategoryId" InsertVisible="False" ReadOnly="True" SortExpression="CategoryId" />
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            <asp:TemplateField HeaderText="Parent Name">
                <InsertItemTemplate>
                    <asp:TextBox ID="txtInsertParentId" runat="server"></asp:TextBox>
                </InsertItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="ContentPath" HeaderText="ContentPath" SortExpression="ContentPath" />
            <asp:BoundField DataField="DisplayUrl" HeaderText="DisplayUrl" SortExpression="DisplayUrl" />
            <asp:BoundField DataField="MetaDesc" HeaderText="MetaDesc" SortExpression="MetaDesc" />
        </Fields>    
</asp:DetailsView>

<asp:LinqDataSource ID="ldsCategories" runat="server" ContextTypeName="ProductsDataContext" TableName="Categories" EnableInsert="True" EnableUpdate="True" OnInserting="ldsCategories_OnInserting" EntityTypeName="" Where="CategoryId == @CategoryId &amp;&amp; Name == @Name" OnInserted="ldsCategories_OnInserted">
    <WhereParameters>        
        <asp:ControlParameter ControlID="txtCategory" Name="Name" PropertyName="Text" Type="String" DefaultValue="" />
    </WhereParameters>
    </asp:LinqDataSource>
4

1 に答える 1

0

私は本当にダミーです。フィールドを削除する必要はありません。非表示にするだけです。

したがって、これは機能します。

dvCategories.Fields[3].Visible = false;

また、FindControlはこの手法でも機能します。コレクションを変更するとfindcontrolが壊れてしまう理由はまだわかりません...

于 2012-12-10T18:31:23.600 に答える