2011年8月9日 星期二

javascript 實現中FileUpload 文件檔類型直接過濾


Asp.net中的FileUpload不提供File Filter功能,而且也不能使用OpenFileDialog。那就只有通过JavaScript实现
<script language="javascript">
function openfile() { try { var fd = new ActiveXObject("MSComDlg.CommonDialog");
fd.Filter 
= "上传文件 (*.jpg;*.jpeg;*.gif)|*.jpg;*.jpeg;*.gif";
fd.FilterIndex 
= 2// 必须设置MaxFileSize. 否则出错 
fd.MaxFileSize = 128;
fd.ShowOpen();
document.getElementById(
"txtFilePath").value = fd.Filename;
catch (e) {
document.getElementById(
"txtFileName").value = "";
}
}
</script>
调用:

   


以上可以实现web中上传过滤。

Fileupload 檢查檔案大小, 拒絕是否有檔案


這時上傳一個沒有內容的 .txt 文件會使得 HasFile 的判斷為 false ,檔案則無法上傳成功
所以將
1if (FileUploadField.HasFile)
改為
1if(FileUploadField.FileName.Length > 0)
一併執行判別最安全 if (FileUpload1.HasFile || (FileUpload1.FileName.Length > 0))

Fileupload 檢查檔案類型 類別使用


 傳入m_file=Fileupload的ID
 private bool CheckFiles(string m_file)
    {
        bool m_return = true;
        FileUpload myFL = new FileUpload();
                   myFL = (FileUpload)this.roundpanel.FindControl(m_file);
roundpanel是放FileUpload的容器
roundpanel等於是FileUpload的上一層才能控制FileUpload
      
        String fileExtension = System.IO.Path.GetExtension(myFL.FileName).ToLower();  //取得上傳的檔案類型
       
       //檢查檔案大小
        if (myFL.PostedFile.ContentLength > 0)
        {
            String[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg" };
            for (int i = 0; i < allowedExtensions.Length; i++)
            {
                if (fileExtension == allowedExtensions[i])
                {
                    return m_return;
                }
            }
        }
      
        return false;
    }

2011年8月7日 星期日

[ASP.NET] 列印網頁內容


 [怎麼印出 Gridview 的內容?]、「怎麼印畫面上部份的內容呢?」甚至比較簡單的「我怎麼設計一個按鈕,讓使用者可以列印網頁畫面?」要達到這個功能該怎麼做呢?
當我們平常在列印的時候,會跳出印表機的視窗讓我們決定要以哪一台 printer 印出我們的內容,那請思考一下真正負責印出來的印表機是位於 Server 端?還是 Client 呢?
答案當然是 Client 端囉~所以程式就必須將要列印的內容丟到 Client 端的印表機去做輸出的動作,不過......ㄝ~不用想的那麼麻煩,底下的使用方式很簡單的。
方法一:直接編寫 button 內容,印出網頁畫面(就是最上面那個圖示的作法)
方法二:寫一個JS檔,搭配前端 button 的觸發,列印指定 DIV 的區塊
方法三:寫個專門用來列印的aspx,裡面只有一個GridView沒有其他東西,再用QueryString傳遞全部、分頁、每頁筆數、第幾頁,然後在該頁利用 JavaScript 的 Windows.print 印出來(Topcat 提供
--------------------------------------------------------------------------------
方法一:直接編寫 button 內容,印出網頁畫面
>>> 這個方法適用直接列印整個網頁的內容,程式碼也很簡單,直接在前端 aspx 裡放入這些按鈕的定義


<object  id=WebBrowser  classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2  height=0  width=0 VIEWASTEXT>object>
<
input  type=button  value=
列印     onclick=document.all.WebBrowser.ExecWB(6,1) id="Button2"name="Button2">
<
input  type=button  value=
直接列印 onclick=document.all.WebBrowser.ExecWB(6,6) id="Button3"name="Button3">
<
input  type=button  value=
頁面設置 onclick=document.all.WebBrowser.ExecWB(8,1) id="Button4"name="Button4">
<
input  type=button  value=
列印預覽 onclick=document.all.WebBrowser.ExecWB(7,1) id="Button5"name="Button5">

貼上所需的程式碼,就可以得到你需要的列印結果。

這個方法也可以用來只列印畫面上某些內容、元件,他是透過 CSS 的 Class 方式,指定到不同 Class ,在到 Class 裡定義顯示(印出)的方法,「請參考」。
================================================
方法二:寫一個JS檔,搭配前端 button 的觸發,列印指定 DIV 的區塊
第一:在前端畫面的 aspx 中,增加下列三項
1st:在 ....區塊裡載入 JS 檔
2nd:利用 DIV 包住你想要讓使用者列印的部份
3rd:在 button 裡增加「
onclientclick="printScreen(print_parts)"」,讓使用者按下按鈕時,會去把 print_parts 的 DIV 區塊,傳到 JS 的 printScreen 方法裡。

<head runat="server">
<
title>列印頁面測試title>
<
script type="text/javascript"  src="print.js">script>
head>

-----------------------
<div id="print_parts">
<asp:Button ID="Button2" runat="server" Text="Button" />
<
asp:GridView ID="GridView2" runat="server"> asp:GridView>

...... 所有你想放的內容,放於此區塊
div>
--------------------------
<asp:Button ID="Button1" runat="server" Text="Button"Height="61px" onclientclick="printScreen(print_parts)"Width="248px" onclick="Button1_Click" />

第二:JS 檔案 (print.js) 的內容,裡頭有一個 function(printScreen)

function printScreen(printlist)
{
  var value = printlist.innerHTML;
  var printPage = window.open("""Printing...""");
  printPage.document.open();
  printPage.document.write("");
  printPage.document.write("
");
  printPage.document.write(value);
  printPage.document.write("
"
);
  printPage.document.close("");
}

第三:撰寫觸發事件,在這個例子中,我的觸發動作是寫在 button1 的 click 事件,當中他會去呼叫了 ClientScript.RegisterClientScriptInclude 再以呼叫 print.js
// Registers the client script with the Page object using a key and a URL, which enables the script to be called from the client.

protected void Button1_Click(object sender, EventArgs e)
{
    Page.ClientScript.RegisterClientScriptInclude("myPrint","print.js");
    // public void RegisterClientScriptInclude(string key, string url)    // http://msdn.microsoft.com/en-us/library/2552td66.aspx}

執行的畫面~按下按鈕後會跳出 DIV 裡的內容到另一個視窗去,並且自動跳出讓使用者選印表機的畫面,按下確定/取消 後,也會自動的關閉這個跳出來的視窗,回到原本呼叫的畫面中


Reference:

~ End

清除 SSMS 登入資訊


 當 SSMS 連到不同的 SQL Server 越來越多,或是使用的帳號各不同,那麼上圖中的 SSMS 登入畫面便會記住許許多多曾經用過了資訊,提供給你方便下次選用,但是很多是測試用平常根本用不上,如此會產生困擾,怎麼清除他呢?
很簡單、很暴力,請將下面路徑中的「Sqlstudio.bin」更名或刪除掉
  • WIN7:C:\Users\'Your_Account_Name'\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell
  • WINXP:C:\Documents and Settings\'Your_Account_Name'\Application Data\Microsoft\Microsoft SQL Server\100\Tools\Shell
  • WinServer 2003 + SQL2005:C:\Documents and Settings\'Your_Account_Name\Application Data\Microsoft\Microsoft SQL Server\90\Tools\Shell
  • WinServer 2008:C:\Users\'Your_Account_Name'\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell
若你以筆記本開啟 Sqlstudio.bin 搜尋 username 或 password 就會發現裡頭記載著你用過的主機資訊或是帳號資訊
當你將他刪除掉之後,重新開啟 SSMS 後,他會重建一個檔案,哪那些擾人無用的資訊就消失無蹤了(當然你常用的主機、帳號資訊也不見了)
Reference:
~ End

[ASP.NET] 使用 acsx 與 aspx - WebUserControl


簡單的說「就是把元件放在 ascx 上,然後在 aspx 裡使用」。今天舉的例子就是在 ascx 裡放入 DataGrid 然後在 aspx 裡呼叫,並以 findcontrol 方式來連結設定相關的屬性。
相關的動作
  1. 增加 WebUserControl (ascx) 檔案
  2. 在 aspx 裡註冊使用 ascx 
  3. 利用 findcontrol 對應 ascx 裡的元件
##增加 WebUserControl (ascx) 檔案 ##
增加「Web 使用者控制項」

然後在 WebuserControl 裡放入你要使用的元件,例如我放入的是「DataGrid」所以增加下面這行程式碼
gd" runat="server">

## 在 aspx 裡註冊使用 ascx ##
-1. 在 aspx 前頭宣告部份增加 
<%@ Register TagPrefix="wuc" TagName="wuc1" Src="~/WebUserControl1.ascx" %>
當然載入的檔名、TagName 都可以自行設定囉~
-2. 在 aspx 的 body 裡,在你想放元件的地方,插入下面這行
wuc1" runat="server" />
## 利用 findcontrol 對應 ascx 裡的元件 ##
元件是放在 ascx 裡,所以在 apsx 裡要應用就必須先用 findcontrol 把他對應起來,底下簡單的例子,是將 findcontrol 的動作寫在 page_load ,然後指定 SqlDataSource 接著 bind 起來
protected void Page_Load(object sender, EventArgs e)
{
   DataGrid gd1 = new DataGrid();
   gd1 = (DataGrid)wuc1.FindControl("gd");
   gd1.DataSource = SqlDataSource1;
   gd1.DataBind ();
}

然後執行就可以了,
-*_*- 但這樣做的目的為何呢?
我想大家都知道 Master Page 可以用來設計通用的版面樣式,只要修改 Master page 底下所有的內容表單都會連動變更,這樣可以省時省力的修改頁面的樣式
相同的,如果你許多頁面都含有 DataGrid 或 Gridview 之類的元件,這些元件會有搭配的顏色及對應的樣式,如果主版面色系一改,那是不是得將所有的 DG、GV 都一起就做修改
萬一頁面有 500頁,改到天黑都來不及下班唷....
那該怎麼辦?那就是將元件放到 ascx 裡並設定樣式,只要修改 ascx 裡樣式,所有引用的頁面都會一起就做修改,快又省事~
即使有多種的樣式,你都一樣可以放在 ascx 裡,然後再各別給名稱就可以了!
~End

2011年8月6日 星期六

on 事件範本dd

http://msdn.microsoft.com/zh-tw/library/7ytf5t7k(v=vs.80).aspx

Lable 事件

//Label 點擊 跳出警告視窗
label1.Attributes.Add( "onclick ",   "alert( 'dsdsds ') ")


//Label 滑鼠移到 跳出窗告視窗
varlbH1.Attributes.Add("onmouseover ", "alert( 'dsdsds ') ");


//滑鼠離開目標後 跳出窗告視窗
varlbH1.Attributes.Add("onMouseOut", "alert( 'dsdsds ') ");
varlbH1.Attributes.Add("onmouseover", "return confirm('你說,你有沒有滑過我?');")

2011年8月5日 星期五

C#--DataReader物件


資料讀取器,從資料來源順向唯讀取出資料流
前面己經介紹過如何連接資料庫了,所以就來個如何讀取出DataReader吧
SqlDataReader dr = cmd.ExecuteReader();//由DataReader讀取SQL敘述的執行結果集
//資料錄逐筆讀取
While (dr.Read())
{
   MsgStr = MsgStr + dr["ColumnName"] + "\r\n";
}

SqlConnection 放在 DataSet 取名Login 然後放在GridView.DataSource

資料配接器,它扮演「資料來源」與「DataSet」之間的中介角色。
範例
//開啟資料庫連接,準備與資料庫進行溝通和存取
SqlConnection conn = new SqlConnection(ConnString);
conn.Open();
//資料配接器的宣告,來執行SQL敘述並開啟資料庫連接
SqlDataAdapter da = new SqlDataAdapter(selectCmd,conn);
//宣告DataSet,用DataAdapter將SQL執行結果填入DataSet所指定的表格中
DataSet ds = new DataSet();
da.Fill(ds,"Login");  //此Login是可以自己定義的,並不是資料庫中真的有這個Table
//把DataSet中的資料表拿來當DataGridView控制項的資料來源
dataGridView1.DataSource = ds.Tables["Login"];
//關閉連接物件與資料配接器物件來釋放物件所佔用的資源
conn.Close();
da.Dispose();

2011年8月3日 星期三

SQL 2008 建立好的資料表,如何再更改欄位屬性,並能儲存

當你第一次安裝好SQL 2008之後
建立第一個資料表
填寫欄位及屬性
好了之後


你發現你的某個欄位屬性選錯了,要再更改
卻改後來發生無法儲存,警告您要刪除重建,
這時不要緊張,只要更改某個設定,就能修改該欄位屬性並能儲存起來


請操作如下:
點選\工具->選項->設計師->防止儲存需要資料表重建的變更(把勾選拿掉即可)
OR(Designers)\資料選項\就能看到


這是新SQL 2008機制@@"還不習慣 ~



2011年7月25日 星期一

CCNA 網路互連 筆記

.網路互連的基本原理
.網路分割
.如何實際使用接器、交接器、路由器、來分割網路
.如果使用路由器來建豆網路

路由器優點:
根據預設,它們不會轉送廣播。
它們可以根據第三層(網路層)的資訊(ip位址)過濾網路。

路由器功能:
.封包交換
.封包過濾
.互連網路的通訊
.路徑選擇
路由器每個LAN 界面不只會分割廣播網域,還會分割碰撞網域。
預設不會轉送任何廣播或多點傳送的封包
會使用網路層標題中的邏輯位址:決定封包的下一個轉送站
使用管理者存取清單,控制可以進出弭面的封包類型,以維護安全
可以視需要提供第二層的橋接功能,並且透過相同面進行遶送
第三層裝置(指路由器)能提供虛據LAN(VLAN)間連結
路由器可以提供服務品質給特定類型的網路交通


橋交器:
被用來分割網路,但是它們並不會隔離廣播或多點傳播的封包

OSI共有七層:
應用層一:提供使用者界面
(定義):檔案、印表、訊息、資料庫應用服務

表現層二:呈現資料 、 處理加密程序
(定義):資料加密、壓縮、轉換服務、解密

會談層三:分開不同應用資料
(定義):對話控制、單工、半雙工、全雙工

傳輸層四:提供可靠或不可靠的遞送、重傳之前的校正錯誤
(定義):終端對終端連結 互連網路的傳送主機與目的主機間建立邏輯連線、建立連線通訊流量控制:接受資料,傳送端會收到確認、重傳沒有收到確認的資料段、資料抵達目的地時,會重新排序,維護可管理資料流避免塞住、過載及資料遺失

網路層五:提供邏輯位置:供路由器來決定路徑
(定義):資料遶送、資料封包、路徑更新、網路位址、界面、衡量指標


資料連結層六:將封包組成訊框中的位元組、使用MAC位址來存取媒介、進行錯誤測,但不校正
(定義):資料訊框、資料的實體傳送,使用硬體位址,遞送訊息給LAN上的適當裝置,並將網路層的訊息轉換位元,供實體層傳輸
路由器間轉送封包時,資料鏈結層會使用硬體定址。當封包在路由器間傳送時,資料鏈結層會加上控制資料形成「訊框」,這些資訊會在接收的路由器中被移除,而保留原始的封包不受影響。
羅輯鏈結控制:辦識網路層協定並且進行封裝,資料鏈結層收到訊框時會依據LLC標頭找出該封包的目地

實體層七:裝置間移動位元、規定電壓、線路速度、與纜線的接腳
(定義):實體拓樸 、位元的值只有「0」或「1」呈現

比喻:

7 應用層:老闆
6 展現層:相當於公司中簡報老闆、替老闆寫信的助理
5 會談層:相當於公司中收寄信、寫信封與拆信封的秘書
4 傳輸層:相當於公司中跑郵局的送信職員
3 網路層:相當於郵局中的排序工人
2 資料鏈結層:相當於郵局中的裝拆箱工人
1 實體層:相當於郵局中的搬運工人

2011年7月24日 星期日

CCNA 考試注意事項(一)

CCNA實作全部範圍,(重點在NAT、FW、Routing、ACL、VLAN、DHCP)


1、如何監測Router的CPU使用率?
2、當CPU使用率高達80%的時候,自動reboot?
3、如何監測router session數量?
4、如何限制每個IP Session的數量?例如 15個。
5、如何讓router每天凌晨三點,定時reboot?
6、當要利用網路連線到另一台Router時,我們會使用Telnet這個指令,
      例如:telnet  140.115.X.X 但為了節省時間,我會直接下Telnet "對方router的名字",就可以連結到對方router,
      請問要怎麼設定,才可以讓已方router在使用telnet的指令時,認得對方router的名字?

建立和使用 C# DLL

HOW TO:建立和使用 C# DLL (C# 程式設計手冊)

Visual Studio 2008

更新:2007 年 11 月
一個動態連結程式庫 (DLL) 會在執行階段連結到您的應用程式。若要示範 DLL 的建立和使用方式,請參考下面案例:
  • MathLibrary.DLL:程式庫檔案,包含可在執行階段呼叫的方法。在此範例中,DLL 包含 Add 和 Multiply 這兩個方法。
  • Add.cs:包含 Add(long i, long j) 方法的原始程式檔。它會傳回其參數的總和。包含 Add 方法的 AddClass 類別是UtilityMethods 命名空間的成員。
  • Mult.cs:原始程式碼,其包含了 Multiply(long x, long y) 方法。它會傳回其參數的乘積。包含 Multiply 方法的MultiplyClass 類別是 UtilityMethods 命名空間的成員。
  • TestCode.cs:包含 Main 方法的檔案。它使用 DLL 中的方法來計算執行階段引數的總和與乘積。
// File: Add.cs 
namespace UtilityMethods
{
    public class AddClass 
    {
        public static long Add(long i, long j) 
        { 
            return (i + j);
        }
    }
}


// File: Mult.cs
namespace UtilityMethods 
{
    public class MultiplyClass
    {
        public static long Multiply(long x, long y) 
        {
            return (x * y); 
        }
    }
}


// File: TestCode.cs

using UtilityMethods;

class TestCode
{
    static void Main(string[] args) 
    {
        System.Console.WriteLine("Calling methods from MathLibrary.DLL:");

        if (args.Length != 2)
        {
            System.Console.WriteLine("Usage: TestCode  ");
            return;
        }

        long num1 = long.Parse(args[0]);
        long num2 = long.Parse(args[1]);

        long sum = AddClass.Add(num1, num2);
        long product = MultiplyClass.Multiply(num1, num2);

        System.Console.WriteLine("{0} + {1} = {2}", num1, num2, sum);
        System.Console.WriteLine("{0} * {1} = {2}", num1, num2, product);
    }
}
/* Output (assuming 1234 and 5678 are entered as command line args):
    Calling methods from MathLibrary.DLL:
    1234 + 5678 = 6912
    1234 * 5678 = 7006652        
*/


這個檔案包含了使用 Add 和 Multiply 等 DLL 方法的演算法。首先,它會剖析從命令列輸入的引數 num1 和 num2,然後再使用 AddClass 類別中的 Add 方法計算總和,並使用 MultiplyClass 類別上的 Multiply 方法計算乘積。
請注意,檔案開頭的 using 指示詞可以讓您使用名稱不符的類別名稱,在編譯時期參考 DLL 方法,如下所示:
MultiplyClass.Multiply(num1, num2);


否則,您必須使用完整名稱,如下所示:
UtilityMethods.MultiplyClass.Multiply(num1, num2);


執行

若要執行此程式,請輸入 EXE 檔的名稱,接著輸入兩個數目,如下所示:
TestCode 1234 5678
若要建立 MathLibrary.DLL 檔案,請使用下列命令列編譯 Add.cs 和 Mult.cs 兩個檔案:
csc /target:library /out:MathLibrary.DLL Add.cs Mult.cs
此處的 /target:library 編譯器選項會通知編譯器輸出一個 DLL,而不要輸出一個 EXE 檔案。後面接續著一個檔案名稱的/out 編譯器選項則是用來指定該 DLL 的檔案名稱。否則編譯器會使用第一個檔案 (Add.cs) 當成 DLL 的名稱。
若要建立可執行檔 TestCode.exe,請使用下列命令列:
csc /out:TestCode.exe /reference:MathLibrary.DLL TestCode.cs
此處的 /out 編譯器選項會通知編譯器輸出一個 EXE 檔案,並指定輸出檔案的名稱 (TestCode.exe)。這個編譯器選項是選擇性的。此處的 /reference 編譯器選項會指定此程式所使用的 DLL 檔案。