[VB.NET] DropDownList Year/Month/Day ที่มีความสัมพันธ์กัน
posted on 05 Jun 2009 11:26 by veeza in Programming
จาก Entry ที่แล้วคุณ
ได้ฝากโจทย์เพิ่มมา ผมเลยมาลองๆ เขียนดู
โจทย์ก็คือ ต้องการสร้าง DropDownList 3 อัน ให้แสดง ปี เดือน วัน ที่สัมพันธ์กัน
มาเริ่มกันเลยนะครับ
ในส่วนของ Design
สร้าง DropDownList ขึ้นมา 3 อัน แสดง ปี เดือน วัน
สร้าง Label เพื่อแสดง วัน/เดือน/ปี ที่เลือก

ในส่วนของ Source
ตั้งค่า Property ตามด้านล่างได้เลยครับ
*ในส่วนของ ddlDay กับ ddlMonth ตั้ง Format ให้อยู่ในรูป dd กับ MM ครับ โดยใช้ DataTextFormatString='{0:00}' เป็นตัวกำหนด
และ DropDownList ทั้ง 3 ตัว กำหนดให้ AutoPostBack="true" คือทำการ Active ทันที่ที่เลือกเสร็จ
Select Month:
<asp:DropDownList ID="ddlYear" runat="server" AutoPostBack="true"
DataValueField="GenYear" DataTextField="GenYear">
asp:DropDownList>
<br />
Select Month:
<asp:DropDownList ID="ddlMonth" runat="server" AutoPostBack="true"
DataValueField="GenMonth" DataTextField="GenMonth" DataTextFormatString='{0:00}'>
asp:DropDownList>
<br />
Select Day:
<asp:DropDownList ID="ddlDay" runat="server" AutoPostBack="true"
DataValueField="GenDay" DataTextField="GenDay" DataTextFormatString='{0:00}'>
asp:DropDownList>
<p>
<asp:Label ID="lblSeleceDate" runat="server" />p>
ในส่วนของ Script
ตรงนี้ผมได้เขียนโปรแกรมย่อยเพื่อเรียกใช้โปรแกรมย่อย (Public Sub) และทำให้ Source Code จะได้ไม่ยาวมากครับ
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Me.Page.IsPostBack Then
Dim DateNow As Date
DateNow = Date.Now()
GenerateDay(Date.DaysInMonth(DateNow.Year, DateNow.Month))
GenerateMonth()
GenerateYear(1900)
Me.ddlDay.SelectedValue = DateNow.Day
Me.ddlMonth.SelectedValue = DateNow.Month
Me.ddlYear.SelectedValue = DateNow.Year
End If
End Sub
Public Sub GenerateYear(ByVal StartYear As Integer)
Dim ThisYear As Integer = Date.Now().Year
Dim dt As DataTable = New DataTable("GenerateYear")
Dim dtc As DataColumn
Dim dtr As DataRow
dtc = New DataColumn()
dtc.DataType = System.Type.GetType("System.Int64")
dtc.ColumnName = "GenYear"
dt.Columns.Add(dtc)
For i As Integer = StartYear To ThisYear
dtr = dt.NewRow()
dtr(0) = i
dt.Rows.Add(dtr)
Next
Me.ddlYear.DataSource = dt
Me.ddlYear.DataBind()
End Sub
Public Sub GenerateMonth()
Dim dt As DataTable = New DataTable("GenerateMonth")
Dim dtc As DataColumn
Dim dtr As DataRow
dtc = New DataColumn()
dtc.DataType = System.Type.GetType("System.Int64")
dtc.ColumnName = "GenMonth"
dt.Columns.Add(dtc)
For i As Integer = 1 To 12
dtr = dt.NewRow()
dtr(0) = i
dt.Rows.Add(dtr)
Next
Me.ddlMonth.DataSource = dt
Me.ddlMonth.DataBind()
End Sub
Public Sub GenerateDay(ByVal TotalDay As Integer)
Dim dt As DataTable = New DataTable("GenerateDay")
Dim dtc As DataColumn
Dim dtr As DataRow
dtc = New DataColumn()
dtc.DataType = System.Type.GetType("System.Int64")
dtc.ColumnName = "GenDay"
dt.Columns.Add(dtc)
For i As Integer = 1 To TotalDay
dtr = dt.NewRow()
dtr(0) = i
dt.Rows.Add(dtr)
Next
Me.ddlDay.DataSource = dt
Me.ddlDay.DataBind()
End Sub
Protected Sub ddlYear_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlYear.SelectedIndexChanged
GenerateDay(Date.DaysInMonth(Me.ddlYear.SelectedValue, Me.ddlMonth.SelectedValue))
End Sub
Protected Sub ddlMonth_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlMonth.SelectedIndexChanged
GenerateDay(Date.DaysInMonth(Me.ddlYear.SelectedValue, Me.ddlMonth.SelectedValue))
End Sub
Protected Sub ddlDay_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlDay.SelectedIndexChanged
Me.lblSeleceDate.Text = "Your select date: " _
& Me.ddlDay.SelectedItem.Text & "/" _
& Me.ddlMonth.SelectedItem.Text & "/" _
& Me.ddlYear.SelectedItem.Text
'--- แสดงผลการเลือกที่ Label
End Sub
ผลการ Run

จบแล้วครับ
เนื่องจากวันนี้งานเข้ามากมายเลยไม่ได้อธิบาย Source Code ให้ละเอียดได้ หากใครติดตรงไหน หรือมีข้อสงสัยอื่นๆ ก็ทิ้งคำถามไว้ได้ครับเดี๋ยวผมจะเข้ามาตอบให้ครับ
โจทย์ก็คือ ต้องการสร้าง DropDownList 3 อัน ให้แสดง ปี เดือน วัน ที่สัมพันธ์กัน
มาเริ่มกันเลยนะครับ
ในส่วนของ Design
สร้าง DropDownList ขึ้นมา 3 อัน แสดง ปี เดือน วัน
สร้าง Label เพื่อแสดง วัน/เดือน/ปี ที่เลือก

ในส่วนของ Source
ตั้งค่า Property ตามด้านล่างได้เลยครับ
*ในส่วนของ ddlDay กับ ddlMonth ตั้ง Format ให้อยู่ในรูป dd กับ MM ครับ โดยใช้ DataTextFormatString='{0:00}' เป็นตัวกำหนด
และ DropDownList ทั้ง 3 ตัว กำหนดให้ AutoPostBack="true" คือทำการ Active ทันที่ที่เลือกเสร็จ
Select Month:
<asp:DropDownList ID="ddlYear" runat="server" AutoPostBack="true"
DataValueField="GenYear" DataTextField="GenYear">
asp:DropDownList>
<br />
Select Month:
<asp:DropDownList ID="ddlMonth" runat="server" AutoPostBack="true"
DataValueField="GenMonth" DataTextField="GenMonth" DataTextFormatString='{0:00}'>
asp:DropDownList>
<br />
Select Day:
<asp:DropDownList ID="ddlDay" runat="server" AutoPostBack="true"
DataValueField="GenDay" DataTextField="GenDay" DataTextFormatString='{0:00}'>
asp:DropDownList>
<p>
<asp:Label ID="lblSeleceDate" runat="server" />p>
ในส่วนของ Script
ตรงนี้ผมได้เขียนโปรแกรมย่อยเพื่อเรียกใช้โปรแกรมย่อย (Public Sub) และทำให้ Source Code จะได้ไม่ยาวมากครับ
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Me.Page.IsPostBack Then
Dim DateNow As Date
DateNow = Date.Now()
GenerateDay(Date.DaysInMonth(DateNow.Year, DateNow.Month))
GenerateMonth()
GenerateYear(1900)
Me.ddlDay.SelectedValue = DateNow.Day
Me.ddlMonth.SelectedValue = DateNow.Month
Me.ddlYear.SelectedValue = DateNow.Year
End If
End Sub
Public Sub GenerateYear(ByVal StartYear As Integer)
Dim ThisYear As Integer = Date.Now().Year
Dim dt As DataTable = New DataTable("GenerateYear")
Dim dtc As DataColumn
Dim dtr As DataRow
dtc = New DataColumn()
dtc.DataType = System.Type.GetType("System.Int64")
dtc.ColumnName = "GenYear"
dt.Columns.Add(dtc)
For i As Integer = StartYear To ThisYear
dtr = dt.NewRow()
dtr(0) = i
dt.Rows.Add(dtr)
Next
Me.ddlYear.DataSource = dt
Me.ddlYear.DataBind()
End Sub
Public Sub GenerateMonth()
Dim dt As DataTable = New DataTable("GenerateMonth")
Dim dtc As DataColumn
Dim dtr As DataRow
dtc = New DataColumn()
dtc.DataType = System.Type.GetType("System.Int64")
dtc.ColumnName = "GenMonth"
dt.Columns.Add(dtc)
For i As Integer = 1 To 12
dtr = dt.NewRow()
dtr(0) = i
dt.Rows.Add(dtr)
Next
Me.ddlMonth.DataSource = dt
Me.ddlMonth.DataBind()
End Sub
Public Sub GenerateDay(ByVal TotalDay As Integer)
Dim dt As DataTable = New DataTable("GenerateDay")
Dim dtc As DataColumn
Dim dtr As DataRow
dtc = New DataColumn()
dtc.DataType = System.Type.GetType("System.Int64")
dtc.ColumnName = "GenDay"
dt.Columns.Add(dtc)
For i As Integer = 1 To TotalDay
dtr = dt.NewRow()
dtr(0) = i
dt.Rows.Add(dtr)
Next
Me.ddlDay.DataSource = dt
Me.ddlDay.DataBind()
End Sub
Protected Sub ddlYear_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlYear.SelectedIndexChanged
GenerateDay(Date.DaysInMonth(Me.ddlYear.SelectedValue, Me.ddlMonth.SelectedValue))
End Sub
Protected Sub ddlMonth_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlMonth.SelectedIndexChanged
GenerateDay(Date.DaysInMonth(Me.ddlYear.SelectedValue, Me.ddlMonth.SelectedValue))
End Sub
Protected Sub ddlDay_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlDay.SelectedIndexChanged
Me.lblSeleceDate.Text = "Your select date: " _
& Me.ddlDay.SelectedItem.Text & "/" _
& Me.ddlMonth.SelectedItem.Text & "/" _
& Me.ddlYear.SelectedItem.Text
'--- แสดงผลการเลือกที่ Label
End Sub
ผลการ Run

จบแล้วครับ
เนื่องจากวันนี้งานเข้ามากมายเลยไม่ได้อธิบาย Source Code ให้ละเอียดได้ หากใครติดตรงไหน หรือมีข้อสงสัยอื่นๆ ก็ทิ้งคำถามไว้ได้ครับเดี๋ยวผมจะเข้ามาตอบให้ครับ
Tags: datatable, dd, dropdownlist, generate, mm, net, vb, yyyy, เขียนโปรแกรม6 Comments


เพราะมันไม่มีการกำหนดว่า Type มันคือ เลข หรือ ตัวหนังสือ
DIM มันเหมารวมได้หมด แต่คิดๆดู นึกถึง DIM SUM = ติ่มซำ เนอะ ฮ่าๆ
#1 By n h e p h e x on 2009-06-05 17:16