第一天
學(xué)習目的:
StringBuilder類(lèi):
命名空間是:System.Text。
StringBuilder類(lèi)是個(gè)高效的類(lèi),StringBuilder.Append連接字符串的方法是非??斓?。用于連接大量的字符串,其速度的優(yōu)越性就會(huì )體現出來(lái)。
先舉幾個(gè)例子:
在cs或vb文件的頭部加上 [C#]using System.Text;
[VB]Imports System.Text
[C#]StringBuilder sbFirst = new StringBuilder();
sbFirst.Append(“這是第一個(gè)學(xué)ASPNET的例子</br>”);
sbFirst.Append( “這個(gè)例子太簡(jiǎn)單</br>”);
sbFirst.Append( “連三歲小陔都會(huì )做,我早知道了,嘿嘿。”);
Response.Write(sbFirst.ToString());
[VB]Dim sbFirst As StringBuilder = New StringBuilder()
sbFirst.Append(“這是第一個(gè)學(xué)ASPNET的例子</br>”)
sbFirst.Append( “這個(gè)例子太簡(jiǎn)單</br>”)
sbFirst.Append( “連三歲小陔都會(huì )做,我早知道了,嘿嘿。”)
Response.Write(sbFirst.ToString)
下面就可以做正題了:
先建立一個(gè)C#的WEB應用程序工程,這廢話(huà)我就少說(shuō)了吧。
放一個(gè)Button控件:ID為btnShowVariable
放一個(gè)Label控件:ID為labServerVariable
添加Button的單擊事件,如下代碼 private void btnShowVariable_Click(object sender, System.EventArgs e)
{
labServerVariables.Text = "";
StringBuilder info = new StringBuilder();
foreach (object objVar in Request.ServerVariables)
{
info.Append("<span style="font-size:9pt">");
info.Append(objVar.ToString());
info.Append(" = <font color=blue>");
info.Append(Request.ServerVariables[objVar.ToString()]);
info.Append("</font></span><br>");
}
labServerVariables.Text = info.ToString();
}
結果顯示:
圖片如下: 
這樣我們就可以這樣用 Response.Write(Request.ServerVariables["REMOTE_ADDR"]); // IP地址
Response.Write("<BR>");
Response.Write(Request.ServerVariables["URL"]); // 網(wǎng)頁(yè)的URL
第三天 VB.NET增加字段代碼稍有不同,如下: 每四天 第五天 第六天 第七天 第八天 第二天
學(xué)習目的:
今天內容很輕松,用一個(gè)例子,輸入年月日,判斷輸入是否正確
圖片如下: 
用個(gè)文本框,ID分別為txtYear,txtMonth,txtDate;
檢驗按鈕的代碼為: private void btnCheck_Click(object sender, System.EventArgs e)
{
int year, month, date;
// 先把輸入的字符轉成int類(lèi)型,如果非數字型,
// 會(huì )觸發(fā)錯誤
try
{
year = Convert.ToInt32(txtYear.Text);
month = Convert.ToInt32(txtMonth.Text);
date = Convert.ToInt32(txtDate.Text);
}
catch
{
labCheckInfo.Text = "輸入的是非數字字符。";
return;
}
// 如果第一步檢驗合格,就把輸入的數字轉化為日期格式
// 如果不符合日期格式即引發(fā)錯誤
try
{
DateTime dt = new DateTime(year, month, date);
}
catch
{
labCheckInfo.Text = "輸入的數字不符合日期格式";
return;
}
labCheckInfo.Text = "輸入正確";
}
嗯,補充一下,關(guān)于StringBuider
在處理字符串的時(shí)候很多人喜歡+=,其實(shí)對于string來(lái)說(shuō),一旦定義了就無(wú)法更改了
所謂的+只是新建的一個(gè)新的string變量并賦值
所以對于盡量使用StringBuider的Append的方法,這樣將大量的節省服務(wù)器的資源
學(xué)習目的:
今天的內容稍多些,而且涉及一些比較常用的,如IsPostBack及DataTable的基本用法。
知識點(diǎn):
IsPostBack:在頁(yè)面onLoad之間是false值,而當從服務(wù)器回傳后,該值變?yōu)閠rue。當頁(yè)面中的Button或ImageButton等觸發(fā)事件,都會(huì )把表單回傳到服務(wù)器,而返回時(shí)又會(huì )引發(fā)onLoad事件。為了節省服務(wù)器資源,有些加載中需進(jìn)行一次,而不需要在回傳后多次發(fā)生,可以用!IsPoskBack來(lái)作為條件,那么頁(yè)面第一次加載后,以后就不會(huì )發(fā)生。該屬性可以幫助你提高程序的性能。
DataTable:即數據表,.Net 程序中最常用的類(lèi),特別是數據庫開(kāi)發(fā)中,沒(méi)有該類(lèi)的程序是不可想象的。
先做個(gè)小程序來(lái)練練手,很簡(jiǎn)單,就一個(gè)下拉菜單,取名dlstWeb。在屬性的Itmes選項中打開(kāi)以下對話(huà)框,添加各項:
圖片如下: 
ASPX中的代碼為: <asp:DropDownList id="dlstWeb" style="Z-INDEX: 101; LEFT: 32px;
POSITION: absolute; TOP: 32px" runat="server"
Width="88px" AutoPostBack="True">
<asp:ListItem value="http://www.sina.com.cn">新浪 </asp:ListItem>
<asp:ListItem value="http://www.sohu.com">搜狐</asp:ListItem>
<asp:ListItem value="http://www.163.com">網(wǎng)易</asp:ListItem>
</asp:DropDownList>
在下拉框的SelectedIndexChanged事件中的加入代碼: private void dlstWeb_SelectedIndexChanged(object sender, System.EventArgs e)
{
Response.Write("<script language=javascript>window.open("" +dlstWeb.Selectedvalue + "");</script>");
}
按F5運行,可是我們發(fā)現這下拉框選擇時(shí)什么事也沒(méi)發(fā)生。原來(lái)原因是出在下拉框的AutoPostBack屬性上,把它設為true后再試試,一切OK了。
下面我們增加些難度,下拉框中的內容很多情況下不是事先固定的,而是要動(dòng)態(tài)添加。這里設計是用一數據表DataTable與之聯(lián)系起來(lái)。
另建一文件,按上添加一下拉框,取名dlstWeb,先設AutoPostPack為false,否則在剛啟動(dòng)而面就觸發(fā)SelectedIndexChanged事件,彈出窗口就亂飛了。
在onLoad事件中添加代碼,注意DataTable用法及IsPoskBack
DataTable屬于System.Data命名空間,所以如果頁(yè)面沒(méi)預添加,可以自行增加這一行。 private void Page_Load(object sender, System.EventArgs e)
{
// 用IsPostBack判斷,只在沒(méi)有回傳時(shí)才初始化
// 這樣可以防止每次刷新或回傳時(shí),都執行一次以下代碼
// 可以節省服務(wù)器的資源了。
if (!IsPostBack)
{
DataTable dt = new DataTable();
DataRow dr;
// 在表中增加字段
dt.Columns.Add("WebName", typeof(string));
dt.Columns.Add("WebUrl", typeof(string));
// 表中增加行
dr = dt.NewRow();
dr["WebName"] = "新浪";
dr["WebUrl"] = " http://www.sina.com.cn ";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["WebName"] = "網(wǎng)易";
dr["WebUrl"] = " http://www.163.com ";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["WebName"] = "搜狐";
dr["WebUrl"] = " http://www.sohu.com ";
dt.Rows.Add(dr);
// 把表與下拉菜單綁定數據
dlstWeb.DataSource = dt;
dlstWeb.DataTextField = "WebName";
dlstWeb.DatavalueField = "WebUrl";
dlstWeb.DataBind();
// 開(kāi)始時(shí)就把下拉菜單的AutoPostBack設為false,
// 防止一開(kāi)始就亂跳出網(wǎng)頁(yè)來(lái)
dlstWeb.AutoPostBack = true;
}
}
下面的事件與前面一模一樣了 private void dlstWeb_SelectedIndexChanged(object sender, System.EventArgs e)
{
Response.Write("<script language=javascript>window.open("" +dlstWeb.Selectedvalue + "");</script>");
}
小結:今天的一些知識非常重要,為了理解,程序的難度并不高。但這是以后程序設計的基礎,所以這些你一定要掌握。
// 在表中增加字段
dt.Columns.Add("WebName", GetType(String))
dt.Columns.Add("WebUrl", GetType(String))
其它都差不多了。
學(xué)習目的:
今天練習數據庫的最基本用法,如何打開(kāi)數據庫。首先在網(wǎng)站設置文件web.config文件的<configuration>下方加入以下節點(diǎn): <configuration>
<appSettings>
<add key="數據庫1" value="ex01.mdb" />
</appSettings>
……
該節點(diǎn)設置了數據庫的路徑,這樣就可以很方便的調用數據庫文件了,調用方法為:
Server.MapPath(ConfigurationSettings.AppSettings["數據庫1"])
這是ASP.NET程序的通用方法,以后介紹的SQL SERVER數據庫也是在此設置的。
好開(kāi)始做程序,首先在CS文件的頭部加入: using System.Configuration; 以下在Page的Load事件中,讀取ACCESS數據庫,并用表格顯示出來(lái):
using System.Data.OleDb;
using System.Text; private void Page_Load(object sender, System.EventArgs e) 顯示結果
{
StringBuilder sbTable = new StringBuilder(); // 用于輸出表格的語(yǔ)句
string strConnection = "Provider=Microsoft.Jet.Oledb.4.0;Data Source="
+ Server.MapPath(ConfigurationSettings.AppSettings["數據庫1"]);
// 連接數據庫的語(yǔ)句
OleDbConnection conn = new OleDbConnection(strConnection);
// 建立DbCommand對象
OleDbCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM Book";
// 打開(kāi)數據庫
conn.Open();
// 用DataReader讀取數據
OleDbDataReader dr = cmd.ExecuteReader();
sbTable.Append("<table cellSpacing="0" cellPadding="0" border="1"><tr>");
sbTable.Append("<td>書(shū)名</td><td>作者</td><td>單價(jià)<td></tr>");
while (dr.Read())
{
sbTable.Append("<tr><td>");
sbTable.Append(dr["BookTitle"].ToString());
sbTable.Append("</td><td>");
sbTable.Append(dr["Author"].ToString());
sbTable.Append("</td><td>");
sbTable.Append(dr["UnitPrice"].ToString());
sbTable.Append("</td><tr>");
}
sbTable.Append("</tr></table>");
// 記住dr用畢必須關(guān)閉,否則會(huì )阻塞服務(wù)器
dr.Close();
// DbConnection是受托管的,可以不關(guān)閉
// 但為良好的編程習慣,應該關(guān)閉
conn.Close();
Response.Write(sbTable.ToString());
}
圖片如下: 
學(xué)習目的:
今天做個(gè)非常普通的例子,做一個(gè)用戶(hù)登錄框。主要是通過(guò)這個(gè)練習認識一下SQL SERVER數據庫的連接方法。和昨天的例子方法基本相同,很容易掌握的。
先建立SQL SERVER數據庫,庫名為AspNetABC,并建立一Member新表,建表SQL如下:
CREATE TABLE [dbo].[Member] (
[MemberID] [int] IDENTITY (1, 1) NOT NULL ,
[MemberName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Password] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Gender] [bit] NOT NULL ,
[Birthday] [datetime] NULL ,
[Email] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
ALTER TABLE [dbo].[Member] WITH NOCHECK ADD
CONSTRAINT [PK_Member] PRIMARY KEY CLUSTERED
(
[MemberID]
) ON [PRIMARY]
與上一例子差不多,在web.config文件中再增加一行: <appSettings>
<add key="數據庫1" value="ex01.mdb" />
<add key="SqlDatabase1" value="data source=localhost;user id=sa;password=sa;initial catalog=AspNetABC;Connect Timeout=30" />
</appSettings>
在面中添加二個(gè)文本框,txtMemberName、txtPassword,并設置txtPassword的TextMode為Password。設置按鈕btnLogin。btnLogin的事件代碼如下: private void btnLogin_Click(object sender, System.EventArgs e)
{
// 先檢驗輸入正確性
if (txtMemberName.Text == String.Empty || txtMemberName.Text.Trim() == "")
{
Response.Write("<script language=javascript>alert("賬號不能為空")</script>");
return;
}
if (txtPassword.Text == String.Empty || txtPassword.Text.Trim() == "")
{
Response.Write("<script language=javascript>alert("沒(méi)有輸入密碼")</script>");
return;
}
string strConnection = ConfigurationSettings.AppSettings["SqlDatabase1"];
string sqlMember = "SELECT MemberName ,[Password] FROM Member "
+ " WHERE MemberName = "" + txtMemberName.Text.Trim() + """
+ " AND [Password] = "" + txtPassword.Text.Trim() + """;
// 連接SqlServer數據庫
SqlConnection conn = new SqlConnection(strConnection);
// 建立SqlCommand
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = sqlMember;
conn.Open();
// 建立DataReader
SqlDataReader dr = cmd.ExecuteReader();
// 判斷DataReader是否為空記錄
if (dr.HasRows)
{
Response.Write("<script language=javascript>alert("" + txtMemberName.Text + "歡迎你!")</script>");
}
else
{
Response.Write("<script language=javascript>alert("找不到該會(huì )員,或密碼錯誤。")</script>");
}
// 千萬(wàn)不要忘記關(guān)閉DataReader
dr.Close();
conn.Close();
}
好了,一個(gè)非常簡(jiǎn)單的登錄框做好了。當然在實(shí)際程序中還應加入跳轉等,這個(gè)就留給你做了。
學(xué)習目的
我們學(xué)得好快,今天做一個(gè)簡(jiǎn)易的新聞發(fā)布網(wǎng)頁(yè),可以說(shuō)是個(gè)演示型的,只是讓大家能理插入數據的最主要步驟。掌握今天的內容,我們就有基礎可以做一個(gè)稍有實(shí)用的新聞程序了。
為了不使注意力分散,程序沒(méi)有加入輸入的驗證,很快我會(huì )接下去寫(xiě)一個(gè)驗證輸入的方法。
圖片如下: 
仍用昨天的方法新建一數據表,SQL語(yǔ)句如下: CREATE TABLE [dbo].[NewsArticle] (
[NewsArticleID] [int] IDENTITY (1, 1) NOT NULL ,
[Title] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SubTitle] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Content] [ntext] COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Writer] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[PubTime] [datetime] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
ALTER TABLE [dbo].[NewsArticle] WITH NOCHECK ADD
CONSTRAINT [DF_NewsArticle_PubTime] DEFAULT (getdate()) FOR [PubTime],
CONSTRAINT [PK_NewsArticle] PRIMARY KEY CLUSTERED
(
[NewsArticleID]
) ON [PRIMARY]
GO
按昨天的方法加入頭部的語(yǔ)句,在提交按鈕中建立以下事件: 注意Command對象的ExecuteNonQuery()方法使用,該方法可以用于插入、更新、刪除等操作,是Command對象的重要方法。今天介紹了Command語(yǔ)句的最基本用法,下次還將介紹占位符的用法。好了,各位先消化一下,明后天將做實(shí)用的東東了。
private void btnPublish_ServerClick(object sender, System.EventArgs e)
{
string strConnection = ConfigurationSettings.AppSettings["SqlDatabase1"];
// 連接SqlServer數據庫
SqlConnection conn = new SqlConnection(strConnection);
// 建立SqlCommand
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "INSERT INTO NewsArticle (Title, SubTitle, Writer, Content) valueS ("
+ """ + txtTitle.Text + "","
+ """ + txtSubTitle.Text + "","
+ """ + txtWriter.Text + "","
+ """ + txtContent.Text + "")";
conn.Open();
//Response.Write (cmd.CommandText);
// 插入記錄
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Response.Write("<script language=javascript>alert("輸入錯誤,數據庫不能更新。")</script>");
}
finally
{
conn.Close();
}
}
學(xué)習目的
昨天介紹了SQL SERVER插入數據,但是我們省略了驗證輸入這一步。以前的做法是用語(yǔ)句逐個(gè)判斷輸入的正確性,如是否為空,長(cháng)度是否超過(guò)等?,F在.NET中有了驗證控件,可以使我們在編程的語(yǔ)句中大在簡(jiǎn)化了。今天介紹驗證控件中最基本的一個(gè),RequeiredFieldValidator控件,是用來(lái)判別否輸入控件是否為空值,如為空則引發(fā)錯誤。
RequeiredFieldValidator可以用來(lái)驗證TextBox、ListBox、DropDownList、RadioButtonList及Html控件中的InputText、TextArea、Select、InputFile等。
屬性介紹:
ControlToValidate:指點(diǎn)驗證某一控件的控件名,如為空,將引發(fā)異常;
ErrorMessage:錯誤提示信息;
IsValid:用于判斷是否通過(guò)驗證;
Display:有三個(gè)值,None表示錯誤時(shí)不顯示信息,但在ValidationSunmmary控件中顯示;Static表示不論錯誤提示是否出現,都占頁(yè)面空間;Dymatic:只有錯誤提示才占用空間。
Text:文本內容。和ErrorMessage一起使用時(shí),將顯示Text錯誤信息。該種情況可以通過(guò)ValidationSummay控件顯示ErrorMessage屬性的提示。
使用方法:
設置: txtTitle:MaxLength(50);
txtSubTitle: MaxLength(50);
txtWriter: MaxLength(10);
這樣可以防止輸入過(guò)長(cháng)字符串
rfvTitle:ControlToValidate(txtTitle)、ErrorMessage(“標題必須輸入。”)
rfvContent:ControlToValidate(txtTitle)、ErrorMessage(“內容必須輸入。”)
這樣在沒(méi)有驗證通過(guò)時(shí),會(huì )出現下圖信息提示,并不執行插入語(yǔ)句。直到驗證正確后,才執行數據更新。
圖片如下: 
學(xué)習目的
在鯨魚(yú)這幾天忙死了,好幾天沒(méi)寫(xiě)了,真對不起各位。這幾天讓XHTML鬧得不開(kāi)心,雖然以前也知道這個(gè),但沒(méi)太在意??涩F在我是如夢(mèng)初醒,我發(fā)覺(jué)XHTML是個(gè)信號,所以這幾天不得不仔細研究一下這個(gè)。很笨,我還沒(méi)發(fā)覺(jué)XHTML的奧妙。確實(shí)如此,沒(méi)上過(guò)臺面,真不知這桌菜怎樣好吃。少說(shuō)了,回到正題。
先把以前的Command的CommandText重新寫(xiě)過(guò):
cmd.CommandText = "INSERT INTO NewsArticle (Title, SubTitle, Writer, Content)"
+ " valueS ( @Title, @SubTitle, @Writer, @Content )";
這樣代碼是否很清晰了,我們可以避免一大串的難以看懂的的語(yǔ)句了。
接下來(lái),我們就給這些定位符賦予屬性和值了: cmd.Parameters.Add("@Title", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@SubTitle", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@Writer", SqlDbType.NVarChar, 10);
cmd.Parameters.Add("@Content", SqlDbType.NText);
以上我們給每個(gè)占位符定義一個(gè)值類(lèi)型,相信不難看懂吧。接者再給于值: cmd.Parameters["@Title"].value = txtTitle.Text.Trim();
if (txtSubTitle.Text == string.Empty || txtSubTitle.Text.Trim() == "")
{
cmd.Parameters["@SubTitle"].value = DBNull.value;
}
else
{
cmd.Parameters["@SubTitle"].value = txtSubTitle.Text.Trim();
}
if (txtWriter.Text == string.Empty || txtWriter.Text.Trim() == "")
{
cmd.Parameters["@Writer"].value = DBNull.value;
}
else
{
cmd.Parameters["@Writer"].value = txtWriter.Text;
}
cmd.Parameters["@Content"].value = txtContent.Text;
其實(shí),也可以這樣寫(xiě): cmd.Parameters.Add("@Title", SqlDbType.NVarChar, 50) .value = txtTitle.Text.Trim(); 這要看你喜歡了。
不錯吧,程序是否很有條理。
程序代碼: private void btnPublish_ServerClick(object sender, System.EventArgs e)
{
string strConnection = ConfigurationSettings.AppSettings["SqlDatabase1"];
// 連接SqlServer數據庫
SqlConnection conn = new SqlConnection(strConnection);
// 建立SqlCommand
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "INSERT INTO NewsArticle (Title, SubTitle, Writer, Content)"
+ " valueS ( @Title, @SubTitle, @Writer, @Content )";
conn.Open();
cmd.Parameters.Add("@Title", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@SubTitle", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@Writer", SqlDbType.NVarChar, 10);
cmd.Parameters.Add("@Content", SqlDbType.NText);
cmd.Parameters["@Title"].value = txtTitle.Text.Trim();
if (txtSubTitle.Text == string.Empty || txtSubTitle.Text.Trim() == "")
{
cmd.Parameters["@SubTitle"].value = DBNull.value;
}
else
{
cmd.Parameters["@SubTitle"].value = txtSubTitle.Text.Trim();
}
if (txtWriter.Text == string.Empty || txtWriter.Text.Trim() == "")
{
cmd.Parameters["@Writer"].value = DBNull.value;
}
else
{
cmd.Parameters["@Writer"].value = txtWriter.Text;
}
cmd.Parameters["@Content"].value = txtContent.Text;
// 插入記錄
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Response.Write("<script language=javascript>alert("輸入錯誤,數據庫不能更新。")</script>");
}
finally
{
conn.Close();
}
}
聯(lián)系客服