DropDownListの値が取得できない

タグの編集
投稿者 kojiro  (社会人) 投稿日時 2020/5/23 11:13:07
WebページでDropDownListを、フォームのロードの時に、作成して、使用したいのですが、
値が取得できずに、困っています。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ddList2.Items.Add("ss")
        For j = syokinen To syuuryounen
            ddList2.Items.Add(j)
        Next    
    End Sub
VS2013とは、違ったのでしょうか?
投稿者 kojiro  (社会人) 投稿日時 2020/5/23 11:20:19
load出ない箇所に、作成し、成功しました。ネットでは、Initのところへ書くようなことも、ありますが、そのInit作成、利用は・・
投稿者 るきお  (社会人) 投稿日時 2020/5/23 12:42:52
試してみましたが、kojiroさんのプログラムでDropDownListに項目を追加できましたよ。

実際に試したコードを載せます。

WebForm1.aspx.vb
Option Strict Off

Public Class WebForm1
    Inherits System.Web.UI.Page

    Private syokinen As Integer = 2015
    Private syuuryounen As Integer = 2020

    Protected Sub Page_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load

        ddList2.Items.Add("ss")
        For j = syokinen To syuuryounen
            ddList2.Items.Add(j)
        Next

    End Sub

End Class


WebForm1.aspx
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="WebApplication27.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <br />
            <br />
            <br />
            <asp:DropDownList ID="ddList2" runat="server">
            </asp:DropDownList>
            <br />
            <br />
            <br />
        </div>
    </form>
</body>
</html>


Initはタイミング的に良くないと思います。

なお、ASP.NET Webフォームは去年リリースされた.NET Framework 4.8版が最後のバージョンですので、今後のことを考えるとASP.NET CoreがWebアプリケーション作成の選択肢になってきます。
とはいえ、ASP.NET Coreでやろうとすると全然プログラムが変わってしまいますので、当面動けばよいというレベルなら乗り換える手間の方がもったいないです。
投稿者 kojiro  (社会人) 投稿日時 2020/5/23 15:04:08
えーと、回答いつもありがとうございます。
        ddList2.Items.Clear()
        ddList2.Items.Add("選択してください")
        For j = syokinen To syuuryounen
            ddList2.Items.Add(j)
        Next
でddList2.Items.Clear()を最初に入れると、だめなようです。
また、loadは何回か行われるのか、これを入れないと、2回以上のリストが作成されます。
投稿者 kojiro  (社会人) 投稿日時 2020/5/23 16:12:21
このコードは、他のDDListのchangedのところに、書きます。その方が、整合性もあり、正常動作しますので。ありがとうございました。
投稿者 るきお  (社会人) 投稿日時 2020/5/23 20:02:46
>loadは何回か行われるのか
Webアプリケーションなので、リクエストのたびにLoadが実行されます。
Windowsフォームアプリケーションにたとえると、リクエストされるとexeが起動され、レスポンスを返すとexeが終了する・・・という動作を繰り返しているのに近いです。

ユーザーがはじめてページにアクセスしたときにはIsPostBackプロパティがFalseになっています。
ボタンをクリックするなどするとユーザーは同じページに再度リクエストを送信することになります。これをWebフォームでは「ポストバック」と呼び、このときにリクエストはIsPostBackがTrueです。

つまり、IsPostBackプロパティを使って1回目なのか2回目以降なのかを判断できます。
初期値を設定したい場合、IsPostBackがFalseであるという条件をつけることが多いです。

次の例では2回目以降のアクセスの場合、ポップアップで選択値を表示するようにしています。ButtonのClickイベントでやったほうがわかりやすいですが、サンプルとしての見通しをよくするためLoadに集めてみました。

Public Class WebForm1
    Inherits System.Web.UI.Page

    Private syokinen As Integer = 2015
    Private syuuryounen As Integer = 2020

    Protected Sub Page_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load

        If Me.IsPostBack = False Then
            'このセッション内ではじめてのリクエストの場合 
            ddList2.Items.Add("ss")
            For j = syokinen To syuuryounen
                ddList2.Items.Add(j)
            Next
        Else
            '2回目以降のリクエストの場合、選択されている値をポップアップで表示します。 
            Dim js As String = "<script>alert(" & ddList2.SelectedValue & ");</script>"
            Me.ClientScript.RegisterStartupScript(Me.GetType"MsgBox", js)
        End If

    End Sub

End Class


もし、Webフォームの基本的な考え方に不慣れなようでしたら、Webフォームについて学習する必要がありますが、なかなか大変なのでお勧めしません。学習コストをかけるのであれば、ASP.NET Coreをお勧めします。
投稿者 kojiro  (社会人) 投稿日時 2020/5/23 20:27:50
If Me.IsPostBack = False Then
            data_input_death_nen()
            ddList2.Items.Clear() ''''''これはいりませんね。
            ddList2.Items.Add("選択してください")
            For i As Integer = syokinen To syuuryounen
                ddList2.Items.Add(i)
            Next
        Else
            '2回目以降のリクエストの場合、選択されている値をポップアップで表示します。 
            Dim js As String = "<script>alert(" & ddList2.SelectedValue & ");</script>"
            Me.ClientScript.RegisterStartupScript(Me.GetType, "MsgBox", js)
        End If
としまして、言われるように動きます。webをユーザーが訪れた場合のクッキーに、postbackを使っていました。
 ありがとうございます。