2011年8月9日 星期二

驗證身份證字號的正確性


public string IDChk(string vid)
{
    List<string> FirstEng = new List<string> { "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "X", "Y", "W", "Z", "I", "O" };
    string aa = vid.ToUpper();
    bool chackFirstEnd = false;
    if (aa.Trim().Length == 10)
    {
        byte firstNo = Convert.ToByte(aa.Trim().Substring(1, 1));
        if (firstNo > 2 || firstNo < 1)
        {
            return "2";
        }
        else
        {
            int x;
            for (x = 0; x < FirstEng.Count; x++)
            {
                if (aa.Substring(0, 1) == FirstEng[x])
                {
                    aa = string.Format("{0}{1}", x + 10, aa.Substring(1, 9));
                    chackFirstEnd = true;
                    break;
                }
  
            }
            if (!chackFirstEnd)
                return "3";
  
            int i = 1;
            int ss = int.Parse(aa.Substring(0, 1));
            while (aa.Length > i)
            {
                ss = ss + (int.Parse(aa.Substring(i, 1)) * (10 - i));
                i++;
            }
            aa = ss.ToString();
            if (vid.Substring(9, 1) == "0")
            {
                if (aa.Substring(aa.Length - 1, 1) == "0")
                {
                    return "0";
                }
                else
                {
                    return "4";
                }
            }
            else
            {
                if (vid.Substring(9, 1) == (10 - int.Parse(aa.Substring(aa.Length - 1, 1))).ToString())
                {
  
                    return "0";
                }
                else
                {
                    return "4";
                }
            }
        }
    }
    else
    {
  
        return "1";
    }
}
//回傳1 代表字數不到10  
//回傳2代表第二碼非1,2  
//回傳3 代表首碼有誤  
//回傳4代表檢查碼不對 

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機制@@"還不習慣 ~