0

次のように、aspxページにTabContainerがあります

<asp:TabContainer ID="tabcontainer" runat="server" ActiveTabIndex="0">
    </asp:TabContainer>

ページの Oninit イベントで C# コードを使用して、上記のコンテナーのタブを作成しています。

protected override void OnInit(EventArgs e)
{
    lstCategories = Service.GetCategories();
    numberOfCategories = lstCategories.Count;
    CreateTabs();
    base.OnInit(e);
}

protected void CreateTabs()
{
    try
    {
        for (int i = 0; i < numberOfCategories; i++)
        {
            TabPanel asptab = new TabPanel();
            asptab.ID = lstCategories[i].Id.ToString();
            asptab.HeaderText = lstCategories[i].Name;
            MyCustomTemplate obj = new MyCustomTemplate(lstCategories[i].Id);
            asptab.ContentTemplate = obj;
            tabcontainer.Tabs.Add(asptab);
        }
    }
    catch (Exception ex)
    {

    }
}
public class MyCustomTemplate : ITemplate
{
    public Table tbl;
    public TextBox tbxQuantity;
    public Image img;
    public int countOfItemsPerRow = 2;
    public MyCustomTemplate(int paramCategoryID)
    {
        categoryID = paramCategoryID;

    }

    public void InstantiateIn(Control container)
    {
        InitialiseTheProperties();
        container.Controls.Add(tblHardware);
    }
    public Table InitialiseTheProperties()
    {

        //Intialize the Mater Table 
        tbl = new Table();

        //Create Row for the mater Table
        TableRow row = new TableRow();
        TableCell cell = new TableCell();

            img = new Image();
            img.ImageUrl = HttpRuntime.AppDomainAppVirtualPath +"/Images/"+"1.jpg";
            cell.Controls.Add(img);
        tblHardware.Rows.cells.add(cell);
            tbxQuantity = new TextBox();
            tbxQuantity.ID ="TbxQuantity";
            cell.Controls.Add(tbxQuantity);
    tblHardware.Rows.cells.add(cell);
            tblHardware.Rows.Add(row);
    //return tbl;
        }

    }

}

今、btnclickeventでこれを試みています

public void btnSave_Click(object sender, EventArgs e)
{
   try
   {
     Control cntrl = Page.FindControl("TbxQuantity");
   }
   catch (Exception ex)
   {
   }
}

null を返すだけです。私は何か間違ったことをしていますか?親切に助けて

4

2 に答える 2

0

問題は動的に追加されたコントロールにあるのではありませんが、FindControlメソッドが子スタックの最後まで伝播およびチェックしないことです。

適切なコントロールが見つかるまで子をチェックする、以下のクイックヘルパーメソッドを作成しました。クイックビルドだったので、おそらく改善できるでしょう。私は試していませんが、おそらくコントロールを拡張できるので、最初のコントロールを渡す必要はありません。私はそれをテストしましたが、何らかの理由でPageオブジェクトを渡すことができなかったため、使用した最初のパネルを渡す必要がありましたが、ポイントを理解できるはずです。

コントロールファインダー

public static class ControlFinder
{
    public static Control Find(Control currentControl, string controlName)
    {
        if (currentControl.HasControls() == false) { return null; }
        else
        {
            Control ReturnControl = currentControl.FindControl(controlName);
            if (ReturnControl != null) { return ReturnControl; }
            else
            {
                foreach (Control ctrl in currentControl.Controls)
                {
                    ReturnControl = Find(ctrl, controlName);
                    if (ReturnControl != null) { break; }
                }
            }

            return ReturnControl;
        }
    }
}

HTMLページ

<asp:Panel ID="pnl1" runat="server">
    <asp:TextBox ID="pnl1_txt1" runat="server" />
    <asp:TextBox ID="pnl1_txt2" runat="server" />

    <asp:Panel ID="pnl2" runat="server">
        <asp:TextBox ID="pnl2_txt1" runat="server" />
        <asp:TextBox ID="pnl2_txt2" runat="server" />

        <asp:Panel ID="pnl3" runat="server">
            <asp:TextBox ID="pnl3_txt1" runat="server" />
            <asp:TextBox ID="pnl3_txt2" runat="server" />
        </asp:Panel>
    </asp:Panel>
</asp:Panel>

<asp:Button ID="btnGo" Text="Go" OnClick="btnGo_Click" runat="server" />

<asp:Panel ID="pnlResults" runat="server">
    <div>pnl1_txt1: <asp:Label ID="lblpnl1txt1" runat="server" /></div>
    <div>pnl1_txt2: <asp:Label ID="lblpnl1txt2" runat="server" /></div>
    <div>pnl2_txt1: <asp:Label ID="lblpnl2txt1" runat="server" /></div>
    <div>pnl2_txt2: <asp:Label ID="lblpnl2txt2" runat="server" /></div>
    <div>pnl3_txt1: <asp:Label ID="lblpnl3txt1" runat="server" /></div>
    <div>pnl3_txt2: <asp:Label ID="lblpnl3txt2" runat="server" /></div>
    <div>unknown: <asp:Label ID="lblUnknown" runat="server" /></div>
</asp:Panel>

ボタンクリックイベント

    protected void btnGo_Click(object sender, EventArgs e)
    {
        Control p1t1 = ControlFinder.Find(pnl1, "pnl1_txt1");
        Control p1t2 = ControlFinder.Find(pnl1, "pnl1_txt2");
        Control p2t1 = ControlFinder.Find(pnl1, "pnl2_txt1");
        Control p2t2 = ControlFinder.Find(pnl1, "pnl2_txt2");
        Control p3t1 = ControlFinder.Find(pnl1, "pnl3_txt1");
        Control p3t2 = ControlFinder.Find(pnl1, "pnl3_txt2");
        Control doesntexist = ControlFinder.Find(pnl1, "asdasd");

        lblpnl1txt1.Text = p1t1 != null ? "Found: " + p1t1.ID : "Not found";
        lblpnl1txt2.Text = p1t2 != null ? "Found: " + p1t2.ID : "Not found";
        lblpnl2txt1.Text = p2t1 != null ? "Found: " + p2t1.ID : "Not found";
        lblpnl2txt2.Text = p2t2 != null ? "Found: " + p2t2.ID : "Not found";
        lblpnl3txt1.Text = p3t1 != null ? "Found: " + p3t1.ID : "Not found";
        lblpnl3txt2.Text = p3t2 != null ? "Found: " + p3t2.ID : "Not found";
        lblUnknown.Text = doesntexist != null ? "Found: " + doesntexist.ID : "Not found";
    }
于 2013-02-08T04:14:11.580 に答える
0

自分で投稿した上記の質問に対する回答を見つけたので、同じまたは同様の問題に遭遇した仲間の人々を助けたいと思います.

string strQuantity=((System.Web.UI.WebControls.TextBox)(((AjaxControlToolkit.TabContainer)(BTN.Parent.FindControl("tabcontainer"))).Tabs[0].FindControl("TbxQuantity"))).Text

サイトを維持してくれた「Stackoverflow」に感謝し、私のような開発者を助けてくれるメンバーにも感謝します。

于 2013-02-08T01:46:08.390 に答える