ASP.NET C# - Server Controls

Microsoft 採取跟 Windows Form 應用程式一樣的方式來建立網站應用程式,

動態處理部分會放在 .aspx,事件處理程式則會將程式碼後置(code-behind) 放在 .cs或.vb

所以都必須先建立一個 form 表單範圍,並且添加 runat=“server”

在 form 內部,就能開始添加控制項,或者事件驅動,

因此,想在HTML元素進行 server side處理,就要向這些元素添加 runat=“server” 屬性,

以及註冊 ID 作為辨識,ID在同一個webForm中不可以重複

例如,在 server side 賦予超連結的url值

在 C# 檔案 C#

mylink.HRef = "http://google.com";

在HTML 表單中,超連結標籤新增了HtmlAnchor 服務器控制向之後,

server side就會透過id來辨識,操控賦予值

aspx

<form id="form1" runat="server">
	<a id="mylink" runat="server">my link</a>
</form>

標準控制項

前面提到,在 Web 設計會透過一個 form 的區塊來處理動態資料

微軟提供相當多的標準控制項,可以直接應來建立各種網頁功能,例如: Label, TextBox, Button, LinkButton, ImageButton, HyperLink, DropDownList, ListBox, CheckBox, CheckBoxList, RadioButton, RadioButtonList, Image, ImageMap, Table, BulletedList, HiddenField, Literal, Calendar, AdRotator, FileUpload, Wizard, Xml, MultiView, Panel, PlaceHolder, View, Substitution, Localize

每一個控制項都有屬性、事件、方法可以使用

我習慣僅單純使用需動態文字、內容,對於樣式屬性控制則交由CSS負責

這裡列出幾個常用的標準控制項,進行說明

[Label] 顯示文字

Lable 控制向主要用來顯示文字資訊

這裡註冊一個ID 為 mylabel aspx

<form id="form1" runat="server">
	<asp:Label ID="mylabel" runat="server"></asp:Label>
</form>

接著在 code-behind 賦予值

C#

mylabel.Text = "my label";

[TextBox] 輸入文字

TextBox 控制項常常需要搭配 TextMode 來指定標籤類型

TextMode 可用的屬性: Color, Date, DateTime, DateTimeLocal, Email, Month, MultiLine, Number, Password, Phone, Range, Search, SingleLine, Time, Url, Week

aspx

<form id="form1" runat="server">
	<asp:TextBox ID="my_textbox" runat="server" TextMode="MultiLine"></asp:TextBox>
</form>

接著在 code-behind 賦予值

C#

my_textbox.Text = "my textbox";

[Button] 按鈕及事件

Button 最常搭配 onclic 呼叫對應事件程式

例如這裡兩個按鈕分別呼叫不同事件 aspx

<form id="form1" runat="server">
	<div>
	 <asp:Button runat="server" onclick="myButtonClickEvent" Text="Click This"/>
	</div>
	<div>
	 <asp:Button runat="server" onclick="myButtonClickEvent2" Text="Click This2"/>
	</div>
</form>

在 code-behind 加入兩個事件

C#

protected void myButtonClickEvent(object sender, EventArgs e)
{
    Response.Write("OK This is myButtonClickEvent Click");
}
protected void myButtonClickEvent2(object sender, EventArgs e)
{
    Response.Write("OK This is myButtonClickEvent2 Click");
}
屬性 說明
AppendDataBoundItems 指示是否在資料繫結之前清除清單項目。
AutoPostBack 指示在使用者變更清單選取項目時,是否會自動向伺服器回傳。
DataSource 設定資料繫結來源。
DataSourceID 設定資料繫結來源控制項 ID
DataMember 設定資料繫結控制項繫結至的資料清單名稱。
DataTextField 設定提供清單項目文字內容的資料來源的欄位。
DataTextFormatString 設定用來控制資料繫結至清單控制項時顯示方式的格式字串。
Items 取得或設定 DropDownList 控制項中項目的集合。

直接提供下拉選單項目:

aspx

<form id="form1" runat="server">
	<asp:DropDownList runat="server">
		<asp:ListItem Value="0">一</asp:ListItem>
		<asp:ListItem Value="1">二</asp:ListItem>
		<asp:ListItem Value="2" Selected="True">三</asp:ListItem>
		<asp:ListItem Value="3">四</asp:ListItem>
	</asp:DropDownList>
</form>

單一資料來源方式建立下拉選單:

aspx

<form id="form1" runat="server">
	<asp:DropDownList ID="DropDownList1" runat="server"></asp:DropDownList>
</form>

C#

//這兩種方式都可以
//List Data
var items = new List<string> {"111", "222", "333" };
//Array Data
string[] items = { "111", "222", "333", "444", "555" };

DropDownList1.DataSource = items;
DropDownList1.DataBind();

value-name 資料來源方式,建立下拉選單:

c#

//若有 post back, 取得目前選擇的值
if (IsPostBack)
{
    Response.Write("<br>" + DropDownList1.SelectedValue + "<----- <br>");
    Response.Write("<br>" + DropDownList1.SelectedItem.Value + "<----- <br>");
    Response.Write("<br>" + DropDownList1.SelectedItem.Text + "<----- <br>");
}
// 僅有首次需要建立資料 (若post back 也 Add ,下拉選項會持續累加)
if (!IsPostBack)
{
    //要先清除 DropDownList 資料
    DropDownList1.Items.Clear();
    List<string[]> myList = new List<string[]> { new string[] { "111", "AAA" }, new string[] { "222", "BBBB" }, new string[] { "333", "CCC" } };
    foreach (var item in myList)
    {
        DropDownList1.Items.Add(new ListItem(item[1], item[0]));
    }
    DropDownList1.DataBind();
}

[ListBox] 單/多重列表項目

ListBox 可以建立單/多選列表

預設為單選,若要多選擇可以使用 SelectionMode: Multiple 列表長度可以透過 Row 來指定顯示的列數

動態資料來源則可參考 DropDownList

aspx

<asp:ListBox runat="server" SelectionMode="Multiple" Rows="10" >
	<asp:ListItem Value="0">一</asp:ListItem>
	<asp:ListItem Value="1">二</asp:ListItem>
	<asp:ListItem Value="2" Selected="True">三</asp:ListItem>
	<asp:ListItem Value="3">四</asp:ListItem>
</asp:ListBox>

[CheckBox] 核選框

CheckBox 可以產生核選單

aspx

<div>
	<label for="my_checkbox">MyCheckbox</label>
	<asp:CheckBox ID="my_checkbox" runat="server" Checked="true" />
</div>

取得 CheckBox 值 C#


if (IsPostBack)
{
    Response.Write(my_checkbox.Checked);
}

[CheckBoxList] 多重核選框

aspx

<asp:CheckBoxList ID="my_checkboxlist" runat="server" CssClass="myList">
    <asp:ListItem Value="1"> A </asp:ListItem>
    <asp:ListItem Value="2"> B </asp:ListItem>
    <asp:ListItem Value="3"> C </asp:ListItem>
    <asp:ListItem Value="4"> D </asp:ListItem>
    <asp:ListItem Value="5"> E </asp:ListItem>
    <asp:ListItem Value="6"> F </asp:ListItem>
</asp:CheckBoxList>

簡單使用 foreach 取得值 C#

if (IsPostBack)
{
	foreach (ListItem item in my_checkboxlist.Items)
	{
	    if (item.Selected)
	    {
	        Response.Write("<br>"+item.Text+"<br>");
	    }
	}
}

儲存在List中 C#

if (IsPostBack)
{
	List<ListItem> selected = new List<ListItem>();
	foreach (ListItem item in my_checkboxlist.Items)
	{
	    if (item.Selected)
	    {
	        selected.Add(item);
	    }
	}
}

[RadioButton] 單一選項按鈕

選項按鈕通常會多選一的方式呈現 因此都會使用到 GroupName 這個屬性來將同類型的選項群組起來

aspx

<asp:RadioButton runat="server" ID="RadioButton1" GroupName="myGroup" Text="my radio1" />
<asp:RadioButton runat="server" ID="RadioButton2" GroupName="myGroup" Text="my radio2" />
<asp:RadioButton runat="server" ID="RadioButton3" GroupName="myGroup" Text="my radio3" />

但是在 code-behind 端,這樣只能透過 Text 屬性取得值

我們希望可以設定一個 value 的方式,可以自己增加這個屬性

aspx

<asp:RadioButton runat="server" ID="RadioButton1" GroupName="myGroup" Text="my radio1" Value="1" />
<asp:RadioButton runat="server" ID="RadioButton2" GroupName="myGroup" Text="my radio2" Value="2"/>
<asp:RadioButton runat="server" ID="RadioButton3" GroupName="myGroup" Text="my radio3" Value="3"/>

透過 Attributes 屬性取得自定義"Value" 值: C#

if (IsPostBack)
{
    if (RadioButton1.Checked)
    {
        Response.Write(RadioButton1.Attributes["Value"]+"</br>");
    }else if (RadioButton2.Checked)
    {
        Response.Write(RadioButton2.Attributes["Value"] + "</br>");
    }else if (RadioButton3.Checked) 
    {
        Response.Write(RadioButton3.Attributes["Value"] + "</br>");
    }
}

[RadioButtonList] 選項按鈕列表

選單按鈕列表可以更方便的直接建立一個群組,而不必再透過 GroupName

aspx

<asp:RadioButtonList runat="server" ID="RadioButtonList1">
    <asp:ListItem>my radiolist1</asp:ListItem>
    <asp:ListItem>my radiolist2</asp:ListItem>
    <asp:ListItem>my radiolist3</asp:ListItem>
</asp:RadioButtonList>

取得方式 C#

RadioButtonList1.SelectedItem.Text

也可以改用取得 Value 的方式 aspx

<asp:RadioButtonList runat="server" ID="RadioButtonList1">
    <asp:ListItem  Value="r1">my radiolist1</asp:ListItem>
    <asp:ListItem  Value="r2">my radiolist2</asp:ListItem>
    <asp:ListItem  Value="r3">my radiolist3</asp:ListItem>
</asp:RadioButtonList>

在 code behind 取得 Vaule C#

Response.Write(RadioButtonList1.SelectedValue

[Panel] 容器

Panel 是一個容器 - 功能區塊的概念

我們可以在這區塊中,進行動態新增元件

首先先定義好區塊

aspx

<asp:Panel runat="server" ID="my_panel">
	This is my panel<br />
</asp:Panel>

<asp:Button ID="Button1" runat="server" Text="Enter..." style="width:85px" onclick="Button1_Click" />

接著在 code behind 建立動態加入控制項 C#


protected void Button1_Click(object sender, EventArgs e)
{
    AddPanelControls();
}

protected void AddPanelControls()
{
    TextBox t1 = new TextBox();
    t1.Text = "Add first textbox";
    TextBox t2 = new TextBox();
    t2.Text = "Add second textbox";
    my_panel.Controls.Add(t1);
    my_panel.Controls.Add(t2);
}

[PlaceHolder] 容器

PlaceHolder 與 Panel 一樣都具有容器的功能

PlaceHolder 但是主要皆著重在動態新增控制項,不提供設定樣式及屬性

aspx

 <asp:PlaceHolder runat="server" ID="my_placeholder">
     This is my PlaceHolder<br />
 </asp:PlaceHolder>

<asp:Button ID="Button1" runat="server" Text="Enter..." style="width:85px" onclick="Button1_Click" />

接著在 code behind 建立動態加入控制項 C#


protected void Button1_Click(object sender, EventArgs e)
{
    AddPlaceHolderControls();
}

protected void AddPlaceHolderControls()
{
    TextBox tp1 = new TextBox();
    tp1.Text = "Add AddPlaceHolderControls first textbox";
    TextBox tp2 = new TextBox();
    tp2.Text = "Add AddPlaceHolderControls second textbox";
    my_placeholder.Controls.Add(tp1);
    my_placeholder.Controls.Add(tp2);
}