- PR -

DropDownListの初期値を変えたい

投稿者投稿内容
猫だいすき
常連さん
会議室デビュー日: 2007/04/09
投稿数: 27
お住まい・勤務地: 兵庫県
投稿日時: 2008-08-25 13:20
Visual Studio 2005 EE ASP.NET 2.0 にて勉強をしています。
WEB画面作成でACCESSのテーブルからDropDownListに年月を取得し、
そのDropDownListの年月からテーブル内容をGridViewに表示するしくみを作ってみました。

DropDownList1 に 年
DropDownList2 に 月

をそれぞれテーブルから取得し、表示することはできました。
DropDownListの年月を指定すると、その年月の内容を表示することもできました。

現状では、テーブル内の最初のデータである「2008年6月」が初期表示される
のですが、初期選択値にシステム日付(2008年8月)を出したいと思っています。

そのような事は可能でしょうか?

SelectedValueやSelectedIndexを参照してPage_Load内に入れてみたのですが
何の変化もありません。

どのようにすれば表示可能か教えてください。
よろしくお願いします。

コード:
Menu5.aspx
        <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="AccessDataSource1" DataTextField="年" DataValueField="年" Width="60px" AutoPostBack="True">
        </asp:DropDownList>年
        <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="AccessDataSource2" DataTextField="月" DataValueField="月" Width="40px" AutoPostBack="True">
        </asp:DropDownList>月
        <asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="~/mdb/Event.mdb"
        SelectCommand="SELECT DISTINCT [年] FROM [イベント]"></asp:AccessDataSource>
        <asp:AccessDataSource ID="AccessDataSource2" runat="server" DataFile="~/mdb/Event.mdb"
            SelectCommand="SELECT DISTINCT [月] FROM イベント WHERE (年 = ?)" >
            <SelectParameters>
                <asp:ControlParameter ControlID="DropDownList1" Name="年" PropertyName="SelectedValue" />
            </SelectParameters>
        </asp:AccessDataSource>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BackColor="White" BorderColor="Tomato" BorderWidth="1px" CellPadding="3" DataSourceID="AccessDataSource3" Width="80%" HorizontalAlign="Center" BorderStyle="Solid" GridLines="Vertical" Font-Bold="False">
            <FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
            <Columns>
                <asp:BoundField DataField="日" HeaderText="日" SortExpression="日"><ItemStyle Width="10%" /></asp:BoundField>
                <asp:BoundField DataField="曜日" HeaderText="曜日" SortExpression="曜日" ><ItemStyle Width="10%" /></asp:BoundField>
                <asp:BoundField DataField="イベント内容" HeaderText="イベント内容" SortExpression="イベント内容" >
                    <ItemStyle HorizontalAlign="Left"/>
                </asp:BoundField>
            </Columns>
            <RowStyle BackColor="White" ForeColor="Black" HorizontalAlign="Center" VerticalAlign="Middle" BorderColor="Red" BorderStyle="Solid"  />
            <HeaderStyle BackColor="#FF6666" Font-Bold="True" ForeColor="White" BorderColor="#FF9999" BorderWidth="1px" />
            <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
            <PagerStyle ForeColor="Black" HorizontalAlign="Center" BackColor="#999999" />
            <AlternatingRowStyle BackColor="#FFCCCC" BorderColor="#FF6666" BorderStyle="Solid" Font-Strikeout="False" Wrap="True" Font-Bold="False" Font-Overline="False" />
        </asp:GridView>
        <asp:AccessDataSource ID="AccessDataSource3" runat="server" DataFile="~/mdb/Event.mdb"
            SelectCommand="SELECT 日, 曜日, イベント内容 FROM イベント WHERE (年 = ?) AND (月 = ?) ORDER BY 日">
            <SelectParameters>
                <asp:ControlParameter ControlID="DropDownList1" Name="年" PropertyName="SelectedValue"
                    Type="Int16" />
                <asp:ControlParameter ControlID="DropDownList2" Name="月" PropertyName="SelectedValue"
                    Type="Int16" />
            </SelectParameters>
        </asp:AccessDataSource>

Menu5.aspx.vb
Partial Class Menu5
    Inherits System.Web.UI.Page

    Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
        Master.SetActiveMenu(5)
    End Sub

    Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        If Not Page.IsPostBack Then
            Dim MM As Integer

            MM = Convert.ToInt16(Month(Today()))
                                                    '↓MM.Tostringを"08"や"8"など直接記述しても、変化なし
            If Not (DropDownList2.Items.FindByValue(MM.Tostring)) Is Nothing Then
                DropDownList2.Items.FindByValue(MM.Tostring).Selected = True
            End If

            TextBox1.Text = MM.Tostring         '←8が取得できている
            TextBox2.Text = DropDownList2.SelectedIndex.ToString     '←0が取得されている
        End If
    End Sub

End Class



<MDBのテーブル定義内容>年月日がキーで重複なし
年 数値 4桁
月 数値 2桁
日 数値 2桁
イベント 文字 255文字

<テーブル内データ例>2008/6/1〜2008/12/31まで毎日のレコードが存在している。
2008 6 1 会議
2008 6 2 打ち合わせ
2008 6 3 空白(なにもなし)

2008 8 1 会議
2008 8 2 資料作成
2008 8 3 空白(なにもなし)

2008 12 1 会議
2008 12 2 打ち合わせ
2008 12 3 空白(なにもなし)
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-08-25 14:16
データバインドが発生した後 (DropDownList.DataBound イベント) に設定すればいけるんじゃないかと思います。
[del]初期表示の際以外は実行されないように気を付けてください。[/del]
(追記) データバインドが実行するタイミングは制御されてるから特に意識する必要ないですね

もしくは DropDownList タグに↓を追加するとか
SelectedValue='<%# Eval(Convert.ToInt16(Month(Today())) %>'

※どちらも未検証です


_________________
C#と諸々

[ メッセージ編集済み 編集者: よこけん 編集日時 2008-08-25 14:24 ]
猫だいすき
常連さん
会議室デビュー日: 2007/04/09
投稿数: 27
お住まい・勤務地: 兵庫県
投稿日時: 2008-08-25 15:56
よこけんさん>
さっそくのお返事ありがとうございます。

引用:
もしくは DropDownList タグに↓を追加するとか
SelectedValue='<%# Eval(Convert.ToInt16(Month(Today())) %>'



こちらを試しましたが、SelectedValueがタグ内コマンドに存在しないため、
このパターンでは出来ませんでした。


引用:
データバインドが発生した後 (DropDownList.DataBound イベント) に設定すればいけるんじゃないかと(略)



こちらは、(DropDownList.DataBound イベント)の意味がいまいちよくわからず、
試行錯誤しながら試しています。

コード:
DropDownList2.DataValueField = Convert.ToString(Month(Today()))



と記述した場合、
[HttpException (0x80004005): DataBinding:
'System.Data.DataRowView' には 08 という名前のプロパティは含まれません。]
というエラーが出たため、DataRowView型 について現在確認中です。

「DropDownList.DataBound イベント」について、詳しい定義がされているWEBサイトがあれば
教えていただけないでしょうか?
MSDNは確認しています。(難しいですが、頑張って読解しています)
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-08-25 16:37
引用:
がおがおさんの書き込み (2008-08-25 15:56) より:

こちらを試しましたが、SelectedValueがタグ内コマンドに存在しないため、
このパターンでは出来ませんでした。



すみません、
SelectedValue='<%# Eval(Convert.ToInt16(Month(Today())) %>'
ではなく
SelectedValue='<%# Convert.ToInt16(Month(Today()) %>'
でした。
# Convert.ToInt16(Month(Today()) では検証してませんが、DateTime.Now.Month で検証してみたところ正常に動作しました。

ちなみに、エディタのインテリセンスでは SelectedValue は表示されません。


引用:
がおがおさんの書き込み (2008-08-25 15:56) より:

こちらは、(DropDownList.DataBound イベント)の意味がいまいちよくわからず、
試行錯誤しながら試しています。
〜中略〜
「DropDownList.DataBound イベント」について、詳しい定義がされているWEBサイトがあれば
教えていただけないでしょうか?
MSDNは確認しています。(難しいですが、頑張って読解しています)



すみません、解説ページは知らないので提示できません。
DataBound イベントは、データバインドが行われた後に発生します。
今回の問題は、データバインドが行われる前に SelectedValue を設定しているため、
SelectedValue が正常に設定されない・もしくはデータバインド時に消されてしまうことが
原因と予想されたために、このイベントをお勧めしました。
こちらも、検証してみたところ正常に動作しました。


引用:
がおがおさんの書き込み (2008-08-25 15:56) より:

コード:
DropDownList2.DataValueField = Convert.ToString(Month(Today()))



と記述した場合、
[HttpException (0x80004005): DataBinding:
'System.Data.DataRowView' には 08 という名前のプロパティは含まれません。]
というエラーが出たため、DataRowView型 について現在確認中です。



DataValueField はバインドする項目の名前を指定するためのものであって、その使い方は間違っています。

_________________
C#と諸々
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-08-25 16:54
ちょっと気になって試してみたのですが、どうやらページロードで SelectedValue を設定しても問題ないみたいです。

コード:
MM = Convert.ToInt16(Month(Today()))
                                        '↓MM.Tostringを"08"や"8"など直接記述しても、変化なし
If Not (DropDownList2.Items.FindByValue(MM.Tostring)) Is Nothing Then
    DropDownList2.Items.FindByValue(MM.Tostring).Selected = True
End If





コード:
DropDownList2.SelectedValue = Month(Today()).ToString()



に書き換えれば正常に動作しませんか?

_________________
C#と諸々
猫だいすき
常連さん
会議室デビュー日: 2007/04/09
投稿数: 27
お住まい・勤務地: 兵庫県
投稿日時: 2008-08-25 17:25
よこけんさんへ>
たびたびありがとうごさいます。

引用:

DataValueField はバインドする項目の名前を指定するためのものであって、その使い方は間違っています。



ですね(汗)
間違っているのを確認しました。

引用:

DropDownList2.SelectedValue = Month(Today()).ToString()



ですが、VB内に記述し実行たところ、
----------------------------------
項目一覧に存在しないため、'DropDownList2' に SelectedValue を指定することは無効です。
パラメータ名: value
----------------------------------
とエラーになり、SelectedValueが何故かエラーになります。
(記述中はエラーのアンダーラインが出ません)


コード:
<asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="AccessDataSource2" DataTextField="月"
 DataValueField="月" Width="40px" AutoPostBack="True">



コード:
<asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="AccessDataSource2" DataTextField="月"
 DataValueField="月" Width="40px" AutoPostBack="True" SelectedValue='<%# Convert.ToInt16(Month(Today()) %>'>



コード:
<asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="AccessDataSource2" DataTextField="月"
 DataValueField="月" Width="40px" AutoPostBack="True" SelectedValue='<%# DateTime.Now.Month %>'>


でも試しましたがSelectedValueでひっかかります。

なんか根本的に間違ってるような気がしてきました(汗)

引用:

エディタのインテリセンスでは SelectedValue は表示されません。


が関係しているようです。確かに表示されないので…

もうちょっと悩んでみます。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2008-08-25 17:50
引用:
がおがおさんの書き込み (2008-08-25 17:25) より:

----------------------------------
項目一覧に存在しないため、'DropDownList2' に SelectedValue を指定することは無効です。
パラメータ名: value
----------------------------------
とエラーになり、SelectedValueが何故かエラーになります。
(記述中はエラーのアンダーラインが出ません)



なるほど、DB 上では、月の列が nchar 等の文字列型で格納されていて、さらに 01, 02 といった具合に 0 パディングされてませんか?
そのエラーは、SelectedValue に入っている値と一致するデータが DB 上に存在しないことを意味しています。
SelectedValue がインテリセンスにでないことは関係ありません。
(元々 SelectedValue プロパティはインテリセンスに表示されないように作られています。)

で、解決策ですが
コード:
Month(Today()).ToString()



コード:
Month(Today()).ToString("00")


というように、0 パディングして文字列化するように書き換えれば大丈夫でしょう。

[追記]
nvarchar ならいいけど nchar (例えば nchar(10) )だったら
コード:
Month(Today()).ToString("00        ")


って感じにスペースも指定しないとダメですね。
_________________
C#と諸々

[ メッセージ編集済み 編集者: よこけん 編集日時 2008-08-25 17:57 ]
猫だいすき
常連さん
会議室デビュー日: 2007/04/09
投稿数: 27
お住まい・勤務地: 兵庫県
投稿日時: 2008-08-26 09:49
よこけんさん>
おはようございます。

お返事いただいた内容を試してみました。
SelectedValueのエラーは出なくなりましたが、相変わらずデータ1件目の6月が初期表示され、
SelectedIndexは−1となっています。

SelectedValueについてですが、これは文字型に限らず、
データの型と桁数が一致していれば大丈夫なんですよね?

数値型同士で比較、文字型で桁数を合わせて比較など、ちょっと試してみてまた報告します。
とりあえずお返事だけ。。。

スキルアップ/キャリアアップ(JOB@IT)