質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

5008閲覧

vb.net 動的コントロールで作成した値を取得したい

ahoudori

総合スコア6

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/12/16 06:33

編集2021/12/16 07:56

今回、処理として行いたいのが以下の通りとなるのですが、②のプルダウンメニューの内容が取得できなく困っております。
①ファイルリスト(img,PDF等)毎にプルダウンメニュー(ソース上ではカスタムコントロールA)を設置
②ボタン(btnUpdate)押下後、設置した各プルダウンメニューの内容を取得

動的にプルダウンメニューを設置しているのですが、動的に設置したプルダウンメニューの内容を取得するにはどうしたらよいかご教授お願い致します。

開発環境は「Visual Studio2019」「.NET Framework」を使用して開発しています。

asp.net (一部抜粋)

<asp:Button ID="btnUpdate" runat="server" Width="50px" /> <%For Each f As System.IO.FileInfo In ファイルリスト%> <font>aaaaaaaa</font> <%Cnt += 1%> <%Add(Cnt.ToString) %> <asp:Panel ID="Panel1" runat="server"></asp:Panel> <ここでファイルを表示> <font>bbbbbbbb</font> <%Next %>

vb.net

Protected Sub Btn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnUpdate.Click Dim test = New カスタムコントロールA test = CType(FindControl("1"), カスタムコントロールA) ←ここで値を取得したい。現在はNothing状態 End Sub Public Sub Add(ByVal cnt As String)※cntには数値の文字列が入ります。 Dim test = New カスタムコントロールA Panel1.Controls.Clear() test.ID = cnt test.Attributes.Add("runat", "server") Panel1.Controls.Add(test) End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/12/16 07:03

まず、何はともあれ、コードは ``` と ``` で囲ってください(``` はバッククォート 3 つ)。インデントされて見やすくなるので。インデントされてないコードはあなたも読む気がしないのでは? 私は全く読む気が起きません。 何を作っているかと(ASP.NET と言っても Web Forms, MVC 他いろいろあります)、開発環境(OS, Visual Studio のバージョン、.NET Framework か Core のどっちかとそのバージョンなど)を書きましょう。こういうプログラム関係の質問をする際の基本のキだと認識すべきです。
退会済みユーザー

退会済みユーザー

2021/12/16 07:28

コードが意味不明です。テキトーなものを殴り書きして投げてきたように見えますが違いますか? 違うのであればここに書かれていること以外は知り得ない第三者が読んで分かるように書いてください。 それから、これを読みましょう→ https://teratail.com/help/question-tips 特に以下の部分: "人に質問をするには、自分が何を尋ねたいかを知っている必要があります。これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです。一見簡単なようですが、実はとても難しいことです。何がわからないかわからない人から質問を受けても、答える側も困ってしまいます。"
退会済みユーザー

退会済みユーザー

2021/12/16 08:58

説明を 2, 3 行追加したようですが、それでだけでは依然として分かりません。コピペすれば動くサンプルコードを提示して、どこで躓いていて何が分かれば解決できるかを説明してもらえないかぎり自分にはお手伝いできることはなさそうです。
vann_2921

2021/12/16 16:25

Protected Sub Btn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnUpdate.Click Dim test = New カスタムコントロールA test = CType(FindControl("1"), カスタムコントロールA) ←ここで値を取得したい。現在はNothing状態 End Sub Dim test = New カスタムコントロールA ですが直後にtestに代入を行っているのでNewは不要と思います。 質問としてはtestに既に存在するカスタムコントロールAを代入したいのでしょうか? それともtestに代入されたカスタムコントロールAの選択された値やアイテムのリストを取得したいのでしょうか?
ahoudori

2021/12/16 16:31

ご連絡ありがとうございます。 「Dim test = New カスタムコントロールA ですが直後にtestに代入を行っているのでNewは不要と思います。」 →確かにおっしゃる通りです。 testに代入されたカスタムコントロールAの選択された値やアイテムのリストを取得したいになります。
guest

回答3

0

自己解決

自己解決しました。
当初はaspx上でvbの処理を書いて動的に作成させようと考えておりましたが、どのプルダウンが選択されたのかが判断できない状態や設定内容がほかにも反映されてしまうため、
repetaerを使用して対応を行いました。

ご回答いただきましてありがとうございます。

投稿2021/12/26 13:42

ahoudori

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/12/26 22:08 編集

ということは、最初の質問の内容は、コメント欄で想像した、 > テキトーなものを殴り書きして投げてきたように見えますが違いますか? は違わなかったということですね?
guest

0

質問のコードはテキトーなものを殴り書きして投げてきたようで意味不明で、修正依頼にも応じてもらえないので話にならないのですが、このままでは 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); } } }

投稿2021/12/19 04:47

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問の回答としてはなぜNothingになるかはこちらではわかりません。デバッグをしてIDが"1"のコントロールが存在しているか確認してください。
おそらくNewするコントロールのIDがcntなのに”1”で決め打ちしているせいと思いますが。
動的にカスタムコントロールAを生成したり、消したりしていますが私ならカスタムコントロールAの中身だけ動的に変更するように実装すると思います。

VB.net

1Public Sub Add(ByVal cnt As String)※cntには数値の文字列が入ります。 2 'Dim test = New カスタムコントロールA 動的にコントロールを作らない。Panel1もカスタムコントロールにしてtestはPanel1クラスのメンバにする 3 'Panel1.Controls.Clear() 動的に削除しない。関数名がAddなのに削除しているのもよくない。AddするならList(Of カスタムコントロールA)などを用意して作成したカスタムコントロールAはすべて管理できるようにする。(ローカル変数にしない) 4 test.Items.Clear() '中身だけクリア 5 test.Items.AddRange({"runat", "server"}) 6 'カスタムコントロールAの型がわからないのでComboBoxと仮定。 7End Sub

コメントを受けて追記
Panel1.FindControlにして下さい。

投稿2021/12/16 16:57

編集2021/12/17 00:09
vann_2921

総合スコア190

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ahoudori

2021/12/16 22:52 編集

回答ありがとうございます。 デバックだと画面生成時はid=1のコントロールが存在しているようなのですが 画面作成→画面表示→追加処理の時にはその情報が見当たらない状態です。 クライアントの生成されてるhtml上だとidがcanに入っている数値(つまり1が)存在しているのでそのidのコントロールがあるように見えるのです。 今回動的に作成している理由としてはファイルリストの個数が処理する対象によって異なるためとなります。 ※また、各ファイルリストの上にひとつずつカスタムコントロールを表示させるといった仕様です。 そのためpanelにcombBoxを入れるとループ処理の影響で前回のcomboxの情報も残るため ひとつ目のファイルリストにはひとつのcombbox 二つ目のファイルには二つのcom boxがつきます。 一つ一つ表示させたいのでpanelを動的にするか一度クリアするかどちらかの処理を行う必要があったのでpanelをクリアしております。 List(Of カスタムコントロールA) についても既に試しているのですが画面表示後中身がなくなるためSessionに保持できないかなーと試したことがありますがうまくできず一旦断念をしています。
vann_2921

2021/12/17 00:03

データに対応したカスタムコントロールAが必要と言うことでしょうか? 質問に追記をお願いします。 また、質問の関数がどのクラスの関数なのかこちらではわかりません。 FindControlを実行するのはカスタムコントロールが配置されているPanelのはすですがBtn_Click関数はPanelのメンバ関数でしょうか?Panel1は毎回コントロールをクリアしているので、Panelにボタンが設置されてるとは考えられません。 なのでFindControlを呼び出しているのはパネルの親コントロールと推測します。 親コントロールはカスタムコントロールを持っていないので何も返ってこないのだと思います。 質問を修正して関数がどのクラスのものなのか分かるようにしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問