質問のコードはテキトーなものを殴り書きして投げてきたようで意味不明で、修正依頼にも応じてもらえないので話にならないのですが、このままでは ASP.NET タグのスレッドのノイズになってしまうので、以下のように質問の ① と ② を勝手に解釈して回答を書いておきます。
①ファイルリスト(img,PDF等)毎にプルダウンメニュー(ソース上ではカスタムコントロールA)を設置
ASP.NET Web Forms アプリで、WebControl を継承したカスタムコントロールを作成。それを「ファイルリスト」と称するリストの中身の数 .aspx ページ上に動的に生成して配置する。
②ボタン(btnUpdate)押下後、設置した各プルダウンメニューの内容を取得
同じ .aspx ページに Button コントロールをドラッグ&ドロップして配置し、Button.Click イベントのハンドラで FindControl メソッドを使って ① で動的に配置したカスタムコントロールの ID から目的のカスタムコントロールオブジェクトを探し、そのプロパティ等の情報を取得する。
そのためには以下の基本的なことが必須です。
(1) カスタムコントロールは WebControl を継承し、FindControl で探せる ID プロパティを持つ。
(2) カスタムコントロールを追加するページの場所に PlaceHolder を静的に配置する(ツールボックスからドラッグ&ドロップする)。
(3) コードビハインドのコード内の Page.Init イベントのハンドラで必要なコントロールを生成し PlaceHolder に追加する。
(4) Button.Click イベントで探すときは PlaceHolder の中から探す。
上記 (1) ~ (4) の要領に従ってコードを書くと以下のようになります。
** .aspx ページ **(マスターページ利用)
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master"
AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs"
Inherits="WebApplication2.WebForm3" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</asp:Content>
** .aspx.cs **(コードビハインド)
質問の「ファイルリスト」というのは何だか不明なので、以下のコードでは単純に文字列の配列としています。
C# が読めなければ変換サービス Telerik Code Converter などを使ってください。
using System;
using System.Web.UI.WebControls;
namespace WebApplication2
{
public partial class WebForm3 : System.Web.UI.Page
{
string[] fileList = new string[] { "document.pdf", "image.jpg", "textfile.txt" };
protected void Page_Init(object sender, EventArgs e)
{
int i = 1;
foreach (string text in fileList)
{
var customControl = new WebCustomControl1();
customControl.ID = i.ToString();
customControl.Text = text;
PlaceHolder1.Controls.Add(customControl);
i++;
var literal = new Literal();
literal.Text = "<br />";
PlaceHolder1.Controls.Add(literal);
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = "";
var ctrl1 = PlaceHolder1.FindControl("1") as WebCustomControl1;
var ctrl2 = PlaceHolder1.FindControl("2") as WebCustomControl1;
var ctrl3 = PlaceHolder1.FindControl("3") as WebCustomControl1;
Label1.Text = $"{ctrl1.Text} / {ctrl2.Text} / {ctrl3.Text}";
}
}
}
質問の「カスタムコントロールA」というのも何だか不明なので、上のコードでは Visual Studio で自動生成されたものをそのまま使っています。
using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication2
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
public class WebCustomControl1 : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["Text"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write(Text);
}
}
}