2013年12月29日 星期日

[HTML] 常用tag記錄

說明:紀錄一些常用的tag

1. <!DOCTYPE>:用來告訴browser使用的HTML版本。目前HTML版本有HTML 4、XHTML 1.0與HTML 5,其中XHTML需有結束tag,並有Strict、Tradtional與Frameset 3種格式。

2. <meta>:用來描述網頁資訊,通常放在<head></head>中,有name、content與http-equiv等屬性。

3. <html></html>:標記內容為HTML碼。

4. <head></head>:描述頁面的相關資訊。

5. <title></title>:定意標題列。

6. <div></div>:將element群組起來,會另起一行(block element),常用id與class屬性搭配CSS。

7. <span></span>:為<div></div>的inline版本,常用id與class屬性搭配CSS。

8. <h1></h1>~<h6></h6>:定義標題格式,<h1>最大,<h6>最小。

9.<p></p>:開新行(block element)。

10. <br />:斷行(empty element)。

11. <hr />:水平線(empty element)。

12. <sup></sup>:顯示上標內容。

13. <sub></sub>:顯示下標內容。

14. <del></del>:刪除線。

15. <ol></ol>:編號清單,通常搭配<li></li>,預設會縮排。

16. <ul></ul>:項目清單,通常搭配<li></li>,預設會縮排。
<ul><li></li>
       <li>
          <ul>
             <li>巢狀清單</li>
          </ul>
       </li>
</ul>。

17. <a href></a>:超連結。
<a href="#top">Back to top</a>

18. <table></table>:表格。

19. <tr></tr>:開新列。

20. <td></td>:儲存格的資料,常用colspan屬性,來跨越多少欄位,rowspan來跨越多少列。

21. <th></th>:表格標題,常用屬性scope定義標題為col或row。

22. <fieldset></fieldset>:群組表單elements。常搭配<legend></legend>。

23. <!-- -->:註解。


參考資料:
ritw.com/w3school/tags/tag_comment.html
http://www.w3schools.com/tags/

2013年12月27日 星期五

[Crystal Report] 設定公式欄位

說明:有時候需要user輸入數值到報表做運算,這時可使用Crystal Report內建的公式欄位來進行後續的運算處理。
例:

原價 100
折數 user輸入
售價 100*折數並四捨五入到整數位


做法:
1. 在xxx.rpt上的欄位總管->公式欄位按右鍵->新增->輸入公式名稱->使用編輯器(個人prefer)
2. 參考Crystal Report提供之運算子或函式視窗,輸入公式:
例:Round (CDbl ({Product.Price}) * {?Rate}, 0) //使用CDbl轉換為數字型別

也可使用If then Else等流程控制函式,例:
if CDbl ({Product.Price}) > 10000
 then Round ((CDbl ({Product.Price})*0.3, 0)
else if  CDbl ({Product.Price}) > 5000
 then Round ((CDbl ({Product.Price})*0.2, 0)
else Round ((CDbl ({Product.Price})*0.1), 0)

也可使用Mid函式來分割字串,例:
Mid ({Test.Item}, 1, 5)
Item為abcdefg=>公式參數顯示為abcdf


參考資料:
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060703143341LX6
http://blog.marksgroup.net/2010/03/crystal-reports-sorting-by-substring.html

2013年12月22日 星期日

[.NET] TimeZone與TimeZoneInfo類別使用記錄

說明:
1. TimeZone類別:用來擷取目前時區的資訊,或本地時間與UTC的互轉適用,但無法用TimeZone來表示本地時區以外的時區,或處理不同時區的轉換,因此,MSDN建議盡量用TimeZoneInfo來代替TimeZone。

例:
//取得目前電腦的時區
TimeZone tzLocal = TimeZone.CurrentTimeZone;
// 轉UTC
DateTime dtNow = DateTime.Now
DateTime dtUTC = tzLocal.ToUniversalTime(dtNow);


2. TimeZoneInfo類別:
主要可定義各地時區,並互相轉換,並可追溯到歷史日光節約時間。

例:
//定義各地時區物件
TimeZoneInfo tziEST = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
TimeZoneInfo tziTST = TimeZoneInfo.FindSystemTimeZoneById("Taipei Standard Time");
TimeZoneInfo tziUTC = TimeZoneInfo.FindSystemTimeZoneById("UTC");
TimeZoneInfo tziLocal = TimeZoneInfo.Local;

// Convert EST to TST by ConvertTime(datetime, source時區, destination時區)
DateTime dtNow = DateTime.Now;
DateTime dtTST = TimeZoneInfo.ConvertTime(dtNow, tziEST, tziTST);


參考資料:
http://msdn.microsoft.com/zh-tw/library/bb384268(v=vs.90).aspx
http://msdn.microsoft.com/zh-tw/library/system.timezone(v=vs.90).aspx
http://msdn.microsoft.com/zh-tw/library/system.timezoneinfo(v=vs.90).aspx
http://msdn.microsoft.com/zh-tw/library/vstudio/bb397767(v=vs.100).aspx
http://msdn.microsoft.com/zh-tw/library/vstudio/bb397765(v=vs.100).aspx

http://www.timeanddate.com/worldclock/city.html?n=805

2013年12月19日 星期四

[C#] 使用XmlDocument與XmlElement類別建立基本XML文件

說明:想產生一份XML文件,該怎麼做?
如:
<Document>
  <Master>
    <Field name="ID" value="12345">
  </Head>
  <Detail>
    <Field name="Name" value="SBC">
    <Field name="Sex" value="Male">
  </Detail>
</Document>


作法:
0. 需引用System.Xml命名空間;

1. 首先使用XmlDocument建構一XML object,例:
XmlDocument xdTest = new XmlDocument();

2. 因XML是由許多節點所組成,因此使用XmlDocument提供的CreateElement方法來建立節點,並assign給XmlElement object,例:
XmlElement xeDocument = xdTest.CreateElement("Document");

可使用<List>XmlElement xeDocument = new List<XmlElement>();
使用迴圈將節點加進去,例:
xeDocument.Add(xdTest.CreateElement("Field"));

xeDocument[index] = xdTest.CreateElement("Field");

3. 設定節點的屬性,如<Field name="ID" value="12345">,Field此節點下有兩個屬性(name與value),透過XmlElement的SetAttribute方法來設定屬性,例:
xeField.SetAttribute("name", "ID");
xeField.SetAttribute("value", "12345");

4. 最後使用XmlElement.AppendChild方法將子節點一層一層加回根節點與XmlDocument object,建立階層關係,例:
xeMaster.AppendcChild(xeField);
xdTest.AppendChild(xeDocument);

5. 接著使用XmldDocument的InnerXml屬性即可檢視產生之XML,例:
string strXml = xdTest.InnerXml;

6. 若要匯出文件,可使用XmlTextWriter類別,例:
XmlTextWriter writer = new XmlTextWriter(@"C:\Test.xml", encoding);
//設定是否縮排
writer.Formatting = Formatting.Indented;
xdTest.Save(writer);


參考資料:
http://www.wangqi.com/html/2007-01/9824.htm
http://www.dotblogs.com.tw/killysss/archive/2010/01/06/12853.aspx
http://www.dotblogs.com.tw/yc421206/archive/2010/08/10/17108.aspx

2013年12月17日 星期二

[Excel] 製作下拉式選單

說明:在Excel中建立下拉式選單供user選取,該怎麼做?


作法:

1. 需先開啟「開發人員」模式:
Excel 2010&2013:檔案->選項->自訂功能區->右側有「開發人員」打勾->確定
Excel 2007:Office按鈕->Excel選項->常用->勾選「在功能區顯示[開發人員]索引標籤」->確定

2. 在分頁上輸入下拉式選單要顯示的值->點選Tab上新增的開發人員->插入->點選下拉式選單圖示
3. 在分頁上點擊左鍵拉入下拉式選單->右鍵出現控制項格式->選擇控制->設定輸入範圍(圈選要顯示的值)->確定


參考資料:
http://blog.bestdaylong.com/2012/10/excel-2010.html
http://hy-chou.blogspot.tw/2013/01/excel.html

[Crystal Report] 參數欄位設定

說明:有時需取得Client端的變數值,該怎麼把值塞到報表上?


作法:
1. 在test.rpt檔上欄位總管->參數欄位->右鍵新增->輸入名稱與選取數值類型->拉到報表上
2. 在test.aspx.cs
     //建構一ReportDocument object
     private ReportDocument rdTest = new ReportDocument();
     string strRptName = Page.MapPath("test.rpt");
   
     //Load
     rdTest.Load(strRptName);
   
     //設定參數欄位的現值
     rdTest.SetParameterValue(string name, object val);
   
     //Bind
     CrystalReportViewer1.ReportSource = rdTest;
     CrystalReportViewer1.DataBind();


參考資料:
http://www.wretch.cc/blog/JohnDX/14586953

[.NET] .NET Reflector

說明:可用來反組譯.NET平台的dll或exe,目前最新版本為Reflector 8。


官網:http://www.red-gate.com/products/dotnet-development/reflector/


參考資料:
http://mitblog.pixnet.net/blog/post/34558377-.net-reflector-7

2013年12月4日 星期三

[C#] DateTime轉字串需顯示毫秒

說明:
使用DateTime.ToString("時間格式"),顯示到毫秒該怎麼做?


作法:
DateTime.ToString("yyyyMMddhhmmssfff"),fff 格式包含毫秒值中任何結尾的零。


參考資料:
http://msdn.microsoft.com/zh-tw/library/bb882581(v=vs.110).aspx

2013年12月3日 星期二

[C#] 透過SqlConnectionStringBuilder設定連線字串

說明:一般連線字串大多透過ConfigurationManager class
來讀取寫在web.config的連線字串,若沒web.config或想修改連線字串時,該如何做?
(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;)


作法:
使用SqlConnectionStringBuilder class:
public static SqlConnectionStringBuilder connStr;
public DataAccess()
{
     connStr = new SqlConnectionStringBuilder();
     connStr.DataSource = "IP";
     connStr.InitialCatalog = "DB name";
     connStr.UserID = "UserID";
     connStr.Password = "Password";
}


參考資料:
http://stackoverflow.com/questions/16511244/how-to-create-connection-string-dynamically-in-c-sharp

[C#] StringBuilder語法紀錄

使用時機:
大量字串串接時,如迴圈中組字串。

1.建立StringBuilder object
StringBuilder sb = new StringBuilder();

2. append字串
sb.Append("test");

3. 移除字串
sb.Remove(int startIndex, int Length);
sb.Remove(sb.Length-1, 1);

4. 轉為string type
sb.ToString();


參考資料:
http://msdn.microsoft.com/zh-tw/library/2839d5h5(v=vs.110).aspx
http://msdn.microsoft.com/zh-tw/library/system.text.stringbuilder(v=vs.110).aspx

[ASP.NET] Enable/Disable GridView裡的LinkButton

說明:在GridView的樣板裡放了LinkButton,並想根據點選LinkButton後紀錄的Status來繫結LinkButton最新的狀態(Enable/Disable)。

例:
Process_No  Process_Name  Check-in       Check-out  
1                  test                LinkButton1  LinkButton2

若Process Check-in後,則LinkButton1 Disable LinkButton2 Enable

作法:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Button btnCheckIn = (Button)e.Row.FindControl("btnCheckIn");
            Button btnCheckOut = (Button)e.Row.FindControl("btnCheckOut");

            btnCheckIn.Enabled = false;
            btnCheckOut.Enabled = false;

            //取得繫結於GridView中各row的Check_Status值
            string strCheckStatus = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "Check_Status"));
            //Initial
            if (strCheckStatus == "0")
            {
                btnCheckIn.Enabled = true;
            }
            //Check in
            else if (strCheckStatus == "1")
            {
                btnCheckOut.Enabled = true;
            }
        }
}


參考來源:
http://stackoverflow.com/questions/17207271/enable-and-disable-link-button-on-gridview

2013年11月21日 星期四

[T-SQL] DATEDIFF函式

說明:想在T-SQL求date欄位與系統日的相差天數。

作法:
DATEDIFF ( datepart , startdate , enddate ),其中datepart表回傳相差的時間格式。

例:
SELECT DATEDIFF(d, Test_date, GETDATE())
FROM Test_Table
WHERE Test_No = '1';


參考資料:
http://technet.microsoft.com/en-us/library/ms189794.aspx

2013年11月20日 星期三

[Oracle] 使用SPOOL匯出script


SET PAGESIZE 1000 --設定每頁行數
SET LINESIZE 1000 --設定每行長度
SET HEADING ON --顯示欄位表頭
SET ECHO ON --顯示SQL Command
SPOOL C:\test.log;

--SQL Command
SELECT sysdate FROM dual;

SPOOL OFF;

2013年11月17日 星期日

[C#] 兩個日期算相差月數與日數

說明:兩個日期字串算相差幾個月與幾天

作法:
public static int GetTimeDiff(string strFrom, string strTo, string strType)
    {
        DateTime dtStart = DateTime.Parse(strFrom);
        DateTime dtEnd = DateTime.Parse(strTo);

        if (strType == "D")
        {
            //使用TimeSpan提供的Days屬性
            TimeSpan ts = (dtEnd - dtStart);
            int iDays = ts.Days + 1;
            return iDays;
        }
        else if (strType == "M")
        {
            int iMonths = dtEnd.Year * 12 + dtEnd.Month - (dtStart.Year * 12 + dtStart.Month) + 1;
            return iMonths;
        }
        else return 0;
    }


參考資料:
http://www.haogongju.net/art/1125129

2013年11月13日 星期三

[ASP.NET] CheckBoxList取得多選之Value

說明:使用CheckBoxList,該如何取得多選之Value?使用SelectedValue只抓得到index最小的Value。

作法1-使用迴圈找Selected的Item:
code behind
StringBuilder sbTest = new StringBuilder();

 for (int i = 0; i < cblTest.Items.Count; i++)
{
    if (cblTest.Items[i].Selected)
    {
        sbTest.Append(cblTest.Items[i].Value.Trim() + ", ");
    }
}
sbTest = sbTest.Remove(sbTest.Length - 2, 2);


作法2-覆寫CheckBoxList控制項的SelectedValue方法:
請參考IN91大文章:
http://www.dotblogs.com.tw/hatelove/archive/2009/01/13/6785.aspx


參考資料:
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20100319135604VSG
http://www.dotblogs.com.tw/hatelove/archive/2009/01/13/6785.aspx

2013年11月4日 星期一

[ASP.NET] 解決DropDownList內ListItem Value重複的問題

說明:在設計DropDownList的清單項目時,一般是不會有Value相同的情況,如果有重複,DropDownList會傳回Index最前面的那筆ItemList,例:

<asp:DropDownList ID="ddlTest" runat="server" AutoPostBack="True">
        <asp:ListItem Value="0">請選擇</asp:ListItem>
        <asp:ListItem Value="1">台北</asp:ListItem>
        <asp:ListItem Value="1">新北</asp:ListItem>
        <asp:ListItem Value="2">桃園</asp:ListItem>
        <asp:ListItem Value="2">新竹</asp:ListItem>
</asp:DropDownList>

點選新北,此時DropDownList卻顯示台北,而且無法觸發 SelectedIndexChanged 事件。


作法:參考ASP.NET魔法學院的作法,override DropDownList的方法,將VB版本改為C#:
1. 新增一專案,在類別內加入System.Web.UI.WebControls參考

namespace WebControls
{
    public class CDropDownList: DropDownList
    {
        //將DropDownList的selectedIndex也PostBack回Server端
        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            bool blAutoPostBack = false;
            string strScript = string.Empty;

            blAutoPostBack = this.AutoPostBack;
            this.AutoPostBack = false;
            base.AddAttributesToRender(writer);

            if (blAutoPostBack)
            {
                base.Attributes.Remove("onchange");
                strScript = String.Format("__doPostBack('{0}',{1})", this.ClientID, "this.selectedIndex");
                writer.AddAttribute(HtmlTextWriterAttribute.Onchange, strScript);
                this.AutoPostBack = true;
            }
        }

 //判斷PostBack的selectedIndex與原selectedIndex是否相同,不同則觸發SelectedIndexChanged 事件
        protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            string[] strValues = new string[35]; //可自己定義陣列大小
            int iSelectedIndex = 0;

            this.EnsureDataBound();
            strValues = postCollection.GetValues(postDataKey);

            if (strValues != null && Page.Request.Form["__EVENTARGUMENT"].ToString() != "")
            {
                iSelectedIndex = Convert.ToInt32(this.Page.Request.Form["__EVENTARGUMENT"]);
            }

            if (this.SelectedIndex != iSelectedIndex)
            {
                base.SetPostDataSelection(iSelectedIndex);
                return true;
            }
            return false;
        }
    }
}

2. 在web專案加入此專案建置後的dll,在工具箱->選擇項目->加入該元件即可,可自訂前置詞(TagPrefix),定義控制項所在命名空間的別名,預設為cc1。


參考資料:

2013年11月3日 星期日

[Excel] VLOOKUP說明與example

說明:做資料比對時,有時會出現兩個工作表需要比對或合併的情形,例:
sheet 1(全員工)
工號 部門代號
001   A01
002   B01
...
999   Z01

sheet 2(組織調整某些員工)
工號 新部門代號
002   U01
008   Z01
....
999   C01

要在sheet 1合併全公司員工的新部門代號,由於非全部員工都有異動,因此sheet 2只有部門調整的員工資料,資料少時還可以一筆一筆對,但資料一多,該如何處理?


作法:有對應的key值,可利用VLOOKUP函數來處理,此函數有四個引數,語法:
VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])

lookup_value:表示要主頁面參照的key值,如以工號為準尋找該員工的資料。注意:該值需在table_array最前面,或第一欄,否則顯示#N/A。
table_array:表示要參照的一系列資料,如sheet 2(有工號與新部門代號)
col_index_num:表Excel要傳回參照的那一欄資料(從1開始),如sheet 2有兩欄,要新部門代號所以填2。
[range_lookup]:非必要,bool值,填0 (false)表完全符合,不填或非0則為true,表大約符合,一般填0。

因此,在sheet 1拉一個新欄位打上VLOOKUP(sheet1A:A, sheet2!A:B, 2, 0)即可顯示新工號的欄位。

P.S. HLOOKUP可用來尋找列資料。


參考資料:
http://felin0630.pixnet.net/blog/post/24888627-%E2%96%8Cexcel%E3%80%82%E5%87%BD%E6%95%B8-%E2%96%8Cexcel%E8%B3%87%E6%96%99%E6%AF%94%E5%B0%8D%E5%B0%8F%E6%8A%80%E5%B7%A7(excel%E5%87%BD%E6%95%B8-
Excel說明

2013年10月24日 星期四

[ASP.NET] RadioButtonList內Item改回水平排列

說明: 一般使用RadioButtonList控制項,其Item預設為垂直排列(vertical),例:
o 選項一
o 選項二
該怎麼改成水平排列(horizontal)?
o 選項一 o 選項二

作法:
只要將此控制項的RepeatDirection屬性改為horizontal即可。


參考資料:
http://blog.yam.com/highscope/article/31505801

2013年10月23日 星期三

[ASP.NET] 子視窗日曆傳值回母視窗控制項上

說明:點選母視窗上的TextBox後,彈出一日曆子視窗,點選日期後回傳至母視窗TextBox上。

作法:
Parent.aspx
<head runat="server">
    <title></title>
<script language="javascript" type="text/javascript">
function SetDate(ClientID)
{
    var Url = '../modaldialog/SetDate.aspx?DialogClientID=' + ClientID;
    window.open(Url, 'Calendar', 'width=335, height=170');
}
</script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:TextBox ID="txtDate" runat="server" onclick="SetDate(this.id)"></asp:TextBox>
    </form>
</body>

Son.aspx
protected void Calendar1_SelectionChanged(object sender, System.EventArgs e)
    {
        if (Request.QueryString["DialogClientID"] != null)
        {
            string strClientID = Request["DialogClientID"].ToString().Trim();
            StringBuilder sbJScript = new StringBuilder();
            sbJScript.Append("window.opener.document.getElementById('" + strClientID + "').value = '" + this.Calendar1.SelectedDate.ToString("yyyy/MM/dd") + "';");
            sbJScript.Append("window.close();");
            ClientScript.RegisterStartupScript(this.GetType(), "ReturnValue", sbJScript.ToString(), true);
        }
    }


參考資料:
http://social.msdn.microsoft.com/Forums/zh-TW/b415ff68-2dcc-4e1c-b202-e41b4e29f8a9/a-popup-b-a-

2013年10月22日 星期二

[ASP.NET] MasterPage套用多語系

說明:一般ASP.NET網頁都是override InitializeCulture method來轉換語系,但因MasterPage是繼承MasterPage class(UserControl),無提供InitializeCulture method。

作法:
1. 自訂一BasePage class(放於App_Code)並繼承Page class,在BasePage中override InitializeCulture method,再使各page從繼承Page改為namespace.BasePage,例:
BasePage.cs
namespace Web
{
    public class BasePage : Page
    {
        protected override void InitializeCulture()
        {
            string culture = Session["culture"].ToString();
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
            base.InitializeCulture();
        }
    }
}

再搭配如DropDownList等控制項供選擇,例:
xxx.aspx
 <asp:DropDownList ID="ddlLanguage" runat="server" AutoPostBack="True" onselectedindexchanged="ddlLanguage_SelectedIndexChanged">
    <asp:ListItem Value="zh-TW" Text="<%$ Resources:PageResource, LanguageZh %>"></asp:ListItem>
    <asp:ListItem Value="en-US" Text="<%$ Resources:PageResource, LanguageEn %>"></asp:ListItem></asp:DropDownList>

xxx.aspx.cs
protected void ddlLanguage_SelectedIndexChanged(object sender, EventArgs e)
{
        if (this.ddlLanguage.SelectedIndex > 0)
        {
            Session["culture"] = this.ddlLanguage.SelectedValue;
            //reload request page
            Server.Transfer(Request.Path);
        }
}

參考資料:
http://stackoverflow.com/questions/11805897/masterpage-initializeculture-no-suitable-method-found-to-override-error

2. 透過global.asax。


2013年10月14日 星期一

[ASP.NET/ Crystal Report] 實作multiple table資料來源且table間無關聯的報表

說明:使用Crystal Reports實做一報表,繫結DB table為2個以上,且table之間無關聯,

作法:
1. 使用DataSet建立報表資料結構,新增DataTable以對應不同DB table,可不需建立DataTableAdapter方法
2. 新增Crystal Report檔,使用資料庫專家->ADO.NET資料集,選取建立的table結構
3. 將資料庫欄位拉至報表上
4. 新增一web page以呈現報表,拉一CrystalReportViewer控制項,依需求調整控制項面板
5. 在code behind繫結資料來源:

例:
//需import該dll
using CrystalDecisions.CrystalReports.Engine;

private ReportDocument rdReport;
protected void Page_Load(object sender, EventArgs e)
{
    rdReport = new ReportDocument();
    if  (!IsPostBack)
    {
        BindReport();
    }
}

private void BindReport()
{
    DataSet dsReport = GetReportData();
    string strRptName = Page.MapPath("ReportView.rpt");
     
    rdReport.Load(strRptName);
    rdReport.SetDataSource(dsReport);
    CrystalReportViewer1.ReportSource = rdReport;
    CrystalReportViewer1.DataBind();
}

private DataSet GetReportData()
{
     DataSet dsReturn = new DataSet();
     DataTable dtTemp = null;

     //此處以DataTable回傳各DB table資料,若table之間有關聯,可以join方式回傳即可,無關聯則取得各table資料,再依Step1建立之table name加進DataSet中即可
    dtTemp = 各sql回傳資料;
    dtTemp.TableName = "Step1中建立的table name";
    dsReturn.Tables.Add(dtTemp);

    return dsReturn;
}


參考資料:
http://csharp.net-informations.com/dataset/dataset-multiple-tables-sqlserver.htm
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20110419171449396
http://www.functionx.com/csharp2/dataset/Lesson02b.htm

2013年10月1日 星期二

[ASP.NET] 如何在GridView加上CheckBox全選與取消全選

說明:
在GridView加上CheckBox針對目標列資料勾選或全選以刪除資料。

作法:
//xxx.aspx
<GridView>
  <Columns>
  <asp:TemplateField>
    <HeaderTemplate>
          <asp:CheckBox ID="cbxHead" runat="server" />
    </HeaderTemplate>
    <ItemTemplate>
          <asp:CheckBox ID="cbxRow" runat="server" />
     </ItemTemplate>
</asp:TemplateField>
</Columns>
</GridView>


//xxx.aspx.cs
 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
 {
         if (e.Row.RowType == DataControlRowType.Header)
        {
            CheckBox cbxHead = (CheckBox)e.Row.FindControl("cbxHead");
            cbxHead.Attributes.Add("onclick", "for(i=0;i<" + GridView1.ClientID + ".all.tags('input').length;i++){if (" + GridView1.ClientID + ".all.tags('input')[i].type=='checkbox'){" + GridView1.ClientID + ".all.tags('input')[i].checked=checked}}");
        }
}

2013年9月26日 星期四

[ASP.NET/AjaxToolKit] 使用CalendarExtender遇到問題紀錄

紀錄一下,使用上遇到的問題:

1. 找不到任何適用特定文化特性或中性文化特性的資源。請確定您已在編譯時期正確地將 "AjaxControlToolkit.Properties.Resources.resources" 嵌入或連結至組件 "AjaxControlToolkit" 中,或所有需要的附屬組件均為可載入且已完整簽署。

Ans: 無加入ToolkitScriptManager或ScriptManager控制項。

2. 加入ToolkitScriptManager控制項後,發生MasterPage的JavaScript或JQuery運作不正常

做法:
1. 在ScriptManager或ToolkitScriptManager控制項加上ScriptMode="Release",此屬性用來決定用戶端指令碼程式庫該使用debug抑或Release的版本,ScriptMode預設為Auto,會跟著web.config的deployment retail的屬性走,預設為false,因此ScriptMode="Debug"。AjaxToolKit官網也建議將ScriptMode="Release",http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/ToolkitScriptManager/ToolkitScriptManager.aspx

//xxx.aspx
<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" ScriptMode="Release"></asp:ToolkitScriptManager>
<asp:TextBox ID="txtDate" runat="server"></asp:TextBox>        
<asp:CalendarExtender ID="txtDate_CalendarExtender" runat="server" Enabled="True" TargetControlID="txtDate"></asp:CalendarExtender>

2. 也可能是以下板友列出的原因:
http://social.msdn.microsoft.com/Forums/zh-TW/81016eba-6e82-479a-b426-fc53f8b1f3ac/calendarextender-


參考資料
http://weblogs.asp.net/lorenh/archive/2008/02/15/speed-up-load-time-of-ajax-control-toolkit-controls-while-debugging.aspx
http://msdn.microsoft.com/zh-tw/library/system.web.ui.scriptmanager.scriptmode.aspx
http://msdn.microsoft.com/zh-tw/library/ms228298.aspx

2013年9月25日 星期三

[C#] Math.Round/Ceiling/Floor用法

說明:
.NET Framework 中的 Round 方法會執行「四捨六入五成雙」(Banker's Rounding),將結尾為 .5 的數字捨入或進位為最接近的偶數,而不是下一個較高的位數。

例如,2.5會捨入為 2,而 3.5 會進位為 4 (當資料交易很大時,此法有助於避免系統性地偏向較高位數的值)。

因此:
Math.Round方法有提供MidpointRounding列舉型別:
//當某個數字剛好位於另外兩個數字之間的中點時,將其捨入成為距離最近的偶數。
ToEven = 0,
//當某個數字剛好位於另外兩個數字之間的中點時,朝向遠離零的方向將其捨入成距離最近的數字。
AwayFromZero = 1,

選擇AwayFromZero即是我們熟知的算術四捨五入,
Math.Round(2.5, 0, MidpointRounding.AwayFromZero) = 3。

P.S. 
在 T-SQL 中,Round函式則會一律往遠離 0 的方向捨入。因此 2.5 會捨入為 3,
但Round(0.5, 0)會出現「轉換 expression 到資料類型 numeric 時發生算術溢位錯誤。」
這應該是因為0.5的資料類型是numeric(1, 1),進位後為1.0導致有效位數不夠。
因此Round(0.4, 0)不會有錯誤。

可使用Round(CAST (0.5 AS numeric(2,1)), 0)增加有效位數或使用字串類型做處理(Round('0.5', 0))



參考資料:
http://www.dotblogs.com.tw/jeff-yeh/archive/2009/06/15/8834.aspx
http://msdn.microsoft.com/zh-tw/library/ms131274(VS.80).aspx
http://msdn.microsoft.com/zh-tw/library/bb882648(v=vs.90).aspx

http://sharedderrick.blogspot.tw/2009/06/round-sql-server-2008.html

http://www.dotblogs.com.tw/jaigi/archive/2011/05/11/24822.aspx


[ASP.NET] 在GridView的footer產生小計

說明:有一GridView1如下
月份 薪水
1       22000
2       22000
3       22000
...      ...
12     22001

不透過sql匯總,想在GridView的footer顯示薪水總和該怎麼做?


作法:
在RowDataBound事件中將數據做匯總,再顯示在footer中。

//xxx.aspx
<GridView ID="GridView1" ShowFooter="True">
</GridView>

//xxx.aspx.cs
   protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        int iSumSalary = 0;

        foreach (GridViewRow gvr in GridView1.Rows)
        {
            iSumSalary += Convert.ToInt32(gvr.Cells[1].Text);
        }

        if (e.Row.RowType == DataControlRowType.Footer)
        {
            e.Row.Cells[0].Text = "合計";
            e.Row.Cells[1].Text = iSumSalary.ToString();
        }
    }

參考資料:
http://www.dotblogs.com.tw/puma/archive/2008/10/17/5713.aspx
http://bibby.be/2009/01/gridview.html

2013年9月17日 星期二

[ASP.NET] 使用DataTable撈Date型別的資料會出現時分秒的解決方式

說明:
使用DataTable抓取T-SQL中資料類型為Date的欄位,日期會出現上午12:00:00。

解決方式:
1. string.format("{0: yyyy/MM/dd}", dt.Rows[index]["Date"]);
2. Convert.ToDateTime(dt.Rows[index]["Date"]).ToString("yyyy/MM/dd");
1.2項適用於直接顯示在TextBox或Lable控制項上

3. <asp:BoundField DataField="Date" DataFormatString="{0:yyyy/MM/dd}" />
4. Text='<%# Eval("Date", "{0:yyyy/MM/dd}") %>'
3.4項適用於繫結至GirdView上

2013年9月9日 星期一

[ASP.NET] 直向顯示GridView

說明:一般GridView顯示格式如下:
身份證字號 | 姓名 | 生日
A123456789  A        70/01/01
B123456789  B         90/12/31

若想換成直向顯示,該怎麼做?
身份證字號: A123456789  
姓名: A
生日: 70/01/01
身份證字號: B123456789  
姓名: B
生日: 90/01/01

解法:
可使用GridView的TemplateFiled,如:

//xxx.aspx
<GridView>
    <Columns>
        <asp:TemplateFiled>
         <ItemTemplate>
            <table>
                <tr>
                    <td><asp:Label ID="lblID" runat="server" Text="身份證字號"></asp:Label></td>
                     <td><asp:TextBox ID="txtID" runat="server" Text='<%# Eval("ID") %>'>                     </asp:TextBox></td>
                 </tr>
                 <tr>
                      <td><asp:Label ID="lblName" runat="server" Text="姓名"></asp:Label></td>
                      <td><asp:TextBox ID="txtName" runat="server" Text='<%# Eval("Name") %>'>                                               </asp:TextBox></td>
                  </tr>
                  <tr>
                      <td><asp:Label ID="lblBirthday" runat="server" Text="生日"></asp:Label></td>
                      <td><asp:TextBox ID="txtBirthday" runat="server" Text='<%# Eval("Birthday") %>'>                                       </asp:TextBox></td>
                   </tr>
            </table>
          </ItemTemplate>
         </asp:TemplateFiled>
    </Columns>
</GridView>

//xxx.aspx.cs
pivate void Bind()
{
    GridView.DataSource = 資料來源;
    GridView.DataBind();
}

參考資料:
http://social.msdn.microsoft.com/Forums/zh-TW/b6d70080-3abb-4223-a2cc-1d1177cd6db4/gridview



[SQL] 自動產生主鍵刪除資料後,主鍵不中斷的小技巧

說明:table內PK為自動產生(SELECT ISNULL(MAX(PK_No), 0) FROM table),現該table有3筆資料,user刪掉第2筆資料,又不想畫面顯示PK_No為1跟3(PK_No中斷)。

解法:
在刪除該table資料後,加上UPDATE table SET PK_No -= 1
                                        WHERE PK_No > 此次刪除的PK_No;

參考資料:
http://www.360doc.com/content/10/0630/19/1554013_36145260.shtml



2013年8月29日 星期四

單車單人帶單眼環半島DAY1_2013/4/11(四)


今日預定行程:枋寮火車站->台東太麻里山采家民宿,全程103公里。
實際行程:枋寮火車站->台東金崙美之濱民宿,全程84.97公里,騎乘時間6小時50分。

出發前一天加班與整理裝備,躺在床上已經凌晨3點了囧,
坐小黃(單車已裝進攜車袋)到板橋高鐵搭上7:08往高雄的車後,心想可以補個眠了XD,沒想到桃園站上來一對夫婦,男的台灣人,女的外國人,重點是他們的可愛混血兒一直在哭囧,小嬰兒真是令人又愛又恨呀~哈。

P.S. 單車上高鐵需攜車袋(黑塑膠袋好像也行),先跟售票員要求劃3排椅靠門邊的位置(給我8車20A)。


9:00整到了新左營,10分鐘後台鐵就要發車了,還好下車廂就有電梯,跟一堆人擠進去,順利的搭上往枋寮的莒光號,心情就變得很輕鬆,因為不用背著14公斤的單車加行李?公斤了囧



P.S. 台鐵車廂比較窄,車袋暫放出入口有點囧,建議找加掛貨車廂的列車。

10:42分抵達枋寮後,趕緊組裝單車,

敲敲打打(誤)了半小時終於要出發啦~照片請路過大哥拍的,以為我要到墾丁,我說要到台東,他愣了一下說加油XD。



終於出發啦~興奮的我,先停小7買卡打車,再停小7吃涼麵,反正不用花自己錢,心想小7真的旅人的好朋友,偏偏決定離開PIC了QQ,路上還接到家裡問狀況跟同事問程式的電話囧,不過有美景心情總是特別開闊,隨看隨停隨拍。


因此入南迴時已經快14:00了(我還不知道時間太晚了,果然新手又傻又天真),一開始還遇到落山風,才意會到網路上說單車最怕逆風跟上坡是啥意思,哈~



入南迴不到半小時,先拍了離太麻里51公里的標示,還拍了放山雞,此時路況都不錯。 
大概是過了雙流後吧,感覺不太一樣了(因此這段沒拍照了XD),路變小了但遊覽車跟砂石車變多了(
遇前方有右彎時先等大車過),此時也遇到熱情的民眾替我加油~有副駕駛side打開車窗的女聲(女生?)、部落的原住民捧友們與騎機車的年輕人,不得不說,身體再疲憊,聽到加油聲,真的會有一股力量湧出來~
       
一直爬坡,帶的水也快喝完了,幸好途中經過一派出所(鐵馬驛站),進去跟警員打個招呼裝滿水,順便詢問還有多久到南迴最高點,警察大人說快到了,剩不到5公里,新手的我OS: 那應該很快冏,接著警察大人建議我晚上可以睡大武或金崙,小弟我回說,民宿訂在太麻里,應該可以啦~ P.S.此時下午16點忘記幾分...

再上路後開始遇到環島車友(對向),第一次看到總是超興奮,看到對方舉起大拇指後,馬上有樣學樣當下回饋,看到車友在滑下坡了,也激起我的鬥志。
但沒想到離壽卡的短短幾公里這麼難騎,幾乎是騎幾百公尺就停下來休息QQ,而且開始下雨了冏,有些路段四周都沒車,真的有點淒涼XD,就在16:56分終於...
看到這令人動容的景象QQ,旁邊199縣道的休息站此時有3個車友在休息,但我只想一股作氣下到尚武那休息XD, 下坡路段真的有夠爽的~之前沒滑過這麼陡的,時速維持在
40內,途中也有遇到對向車友,此時對方埋頭努力中,我大聲跟他說加油XD,大概半小時抵達小7^0^。
P.S. 以前騎機車走南迴時,都會注意到台9的444公里處,現在開了家小7,有種滄海桑田之感XD

在小7吃點東西(包子跟茶葉蛋,印象中沒吃過小7包子...不好吃)稍作休息後,將近18:00往北走~


當時心裡想說說不到會用到,隨手一拍的結果,竟成我當晚的落腳處冏。



離太平洋好近~也是第一次騎南迴到台東,很難用言語形容的感覺...很感動

後來騎到大武市區天已全黑,當下有閃過今晚睡這的念頭,不過被莫名的自信/自尊心給矇蔽了XD,沒想到接下來這段路成了我旅途難忘的回憶QQ

現在的我回想起來,還會起一絲絲雞皮疙瘩冏,過了大武後的南迴公路完全沒有路燈,記得有一段離大平洋很近,右手邊的海浪聲近在咫尺,海水還飄到我臉上冏(當時沒下雨),路上偶爾有汽車經過,但大部分的時間只有我一個隱身在沒有月光的黑夜QQ,汽車接近時都特別打遠燈,離我遠遠的超過去(我有配備LED前後燈),加上是山路,上上下下根本騎不快,終於在20:00初看到一家全家,真的是黑暗的明燈,沙漠的綠洲呀XD,在這裡吃個布丁跟八寶粥,還在FB po文,此時距民宿28公里,距金崙10公里(店裡有標示),看著店裡的顧客都是開車來的,只有傻子我騎單車QQ。
再次上路約20:40多,這段右手邊都是樹,心裡也不敢亂想只能盡力騎,當下有點後悔好好的家裡那麼舒服不待,沒事幹麼跑來單車環島冏,還有想起古小姐曾叫我從大武火車站騎的建議,不過木已成舟,還好一路平安的在21:20多分抵達金崙小7,馬上查並問了幾家民宿,看到美之濱有車友住過(單車可放室內),且老闆開價500元符合預算,才決定放棄原先預訂的山采家民宿(200元訂金飛了QQ),到民宿登記後,老闆得知我獨自摸黑騎大武市區後到金崙這段15公里的山路,跟我說以後別再摸黑騎那段,因為....(消音),他說如果是他子女這樣騎,他會心酸冏,然後叫我趕快去休息,後來弄到12點才睡覺XD。
 

 




2013年8月27日 星期二

[C#] Form1的標題列如何動態render


.xxx.aspx.cs
this.Text = 值

參考資料:
http://zhidao.baidu.com/question/570402718.html

[ASP.NET] DropDownList常用語法紀錄

1. 資料繫結
xxx.aspx.cs
ddlTest.DataSource = 資料來源;
ddlTest.DataTextField = 繫結欄位Text字串;
ddlTest.DataValueField = 繫結欄位Value字串;
ddtTest.Text = 指定顯示Value;

//若繫結欄位為DataTable的Date欄位,要去除上午12:00:00
for (int i = 0; i < ddlTest.Items.Count; i++)
{
    ddlTest.Items[i].Text = Convert.ToDateTime(ddlTest.Items[i].Text).ToString("yyyy/MM//dd");
    ddlTest.Items[i].Value = Convert.ToDateTime(ddlTest.Items[i].Value).ToString("yyyy/MM//dd");
}

2. 取得選取項目文字與值
xxx.aspx
<asp:DropDownList ID="ddlTest" runat="server">

xx.aspx.cs
string strText = ddlTest.SelectedItem.Text; //取得選擇的Text
string strValue = ddlTest.SelectedValue;//取得選擇的Value


3.1 下拉選單預設先顯示「請選擇」項目,再出現繫結的資料。
有下列方法,可搭配if (ddlTest.SelectedIndex > 0)。:
3.1.1
xxx.aspx.cs
 ListItem item = new ListItem();
 item.Text = "請選擇";
 item.Value = "0";
 item.Selected = true;
 ...
 this.ddlTest.DataBind();
 this.ddlTest.Items.Add(item);

 ...
 this.ddlTest.DataBind();
 this.ddlTest.Items.Insert(0, "請選擇"或item));

3.1.2.
//xxx.aspx 繫結靜態項目
<asp:DropDownList ID="ddlTest" runat="server"  AppendDataBoundItems="True">
<asp:ListItem Value="0"  Text="請選擇"></asp:ListItem>
</asp:DropDownList>

3.2 清空已繫結項目 (使用兩個DropDownList做連動,第二個DropDownList的AppendDataBoundItems屬性設成 true,導致Item重複繫結 )
ddlTest.Items.Clear();
會連靜態繫結項目都清空,可以搭配ddlTest.Items.Insert(index, item)或ddlTest.Items.Add(item)來重新繫結。


4. ListItem Text繫結資源檔
xxx.aspx
<asp:DropDownList ID="ddlTest" runat="server">
        <asp:ListItem Value="ID" Text="<%$ Resources:PageResource, ID %>"></asp:ListItem>
        <asp:ListItem Value="Name" Text="<%$ Resources:PageResource, Name %>"></asp:ListItem>
</asp:DropDownList>

to be continued...

2013年8月26日 星期一

[ASP.NET] 下載PDF檔案

 private void DownloadFile(string strFile_Path)
 {
        string strFilePath = Server.MapPath(strFile_Path);

        if (strFilePath.Split('\\').Length != 0)
        {
            string strFileName = strFilePath.Split('\\')[strFilePath.Split('\\').Length - 1];

            //中文檔名作轉換
            //strFileName = HttpUtility.UrlEncode(strFileName, System.Text.Encoding.UTF8);

            FileStream fs = new FileStream(strFilePath, FileMode.Open);
            Byte[] byBuf = new Byte[fs.Length];

            fs.Read(byBuf, 0, Convert.ToInt32(fs.Length));
            fs.Close();
            fs.Dispose();

            Response.Clear();
            Response.ClearHeaders();
            Response.Buffer = true;
            //轉換文字檔編碼格式用,但本次輸出無文字檔,故註解此段
            //Response.ContentEncoding = parEncoding;
            Response.AddHeader("content-disposition", "attachment; filename=" + strFileName);

            Response.ContentType = "application/octet-stream";
            Response.BinaryWrite(byBuf);
            Response.End();
        }
 }

參考資料:
http://gogo1119.pixnet.net/blog/post/26900755-%5Basp.net%5D-%E7%84%A1%E7%B6%B2%E5%9D%80%E7%9A%84%E6%AA%94%E6%A1%88%E4%B8%8B%E8%BC%89

[C#] 發送內嵌多個圖片的Mail

public void SendMail()
{
            Encoding encode = Encoding.GetEncoding("UTF-8");
            MailMessage myMail = new MailMessage();

            myMail.From = new MailAddress("admin@test.com", string.Empty, encode);
            myMail.To.Add("a@test.com, b@test.com");
            myMail.Subject = "Test";
            myMail.SubjectEncoding = encode;
            myMail.Body = "<img src=\"test1.jpg\" /><img src=\"test2.jpg\" />";
            myMail.BodyEncoding = encode;

            //需啟用html格式才可內嵌圖片
            myMail.IsBodyHtml = true;

            myMail.Attachments.Add(GetAttachment("test1.jpg", encode));
            myMail.Attachments.Add(GetAttachment("test2.jpg", encode));

            SmtpClient smtp = new SmtpClient("localhost");

            try
            {
                smtp.Send(myMail);
                MessageBox.Show(DateTime.Now.ToString() + " 寄信成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(DateTime.Now.ToString() + " 寄信失敗" + ex.ToString());
            }
}

 private Attachment GetAttachment(string strFileName, Encoding encode)
 {
            //設定圖片路徑
            string strFilePath = @"C:\" + strFileName;
            Attachment attachment = new Attachment(strFilePath);
            attachment.Name = strFileName;
            attachment.NameEncoding = encode;
            attachment.TransferEncoding = TransferEncoding.Base64;

            // 設定附件為內嵌
            attachment.ContentDisposition.Inline = true;
            attachment.ContentDisposition.DispositionType = "inline";

            return attachment;
 }

參考資料:
http://blog.miniasp.com/post/2008/02/06/How-to-send-Email-with-embedded-picture-image.aspx
http://www.dotblogs.com.tw/sam19820611/archive/2009/09/09/10509.aspx

2013年8月20日 星期二

[ASP.NET] 使用showModalDialog開啟子視窗輸入資料後,再進行母視窗動作。

說明:點選GridView內的LinkButtion下載檔案時,需在子視窗TextBox輸入原因才可回母視窗動作。
做法:使用Session來判斷子視窗TextBox是否有值。

//Son.aspx
<form id="form1" runat="server">
    <div>
        <asp:HiddenField ID="hidFileID" runat="server" />
        <asp:TextBox ID="txtReason" runat="server"></asp:TextBox>
        <asp:Button ID="btnSave" runat="server" Text="儲存" onclick="btnSave_Click" />
    </div>
</form>

//Son.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
    Session["Reason"] = null;
}

protected void btnSave_Click(object sender, EventArgs e)
{
       bool blReturn = false;
       if (!string.IsNullorEmpty(txtReason.Text))
       {
           if (!string.IsNullorEmpty(hidFileID.Value))
           {
               blReturn = 呼叫儲存資料method;
               if (!blReturn)
               {
                   //showMsg("error");
               }
               else
               {
                   Session["Reason"] = txtReason.Text;
                   //儲存原因後關閉子視窗
                   Response.Write("<script>window.close();</script>");
               }
           }
       }
}

Parent.aspx
<asp:BoundField DataField="File_ID" HeaderText="檔案代碼" />
<asp:BoundField DataField="File_Path" HeaderText="檔案路徑"  />
<asp:TemplateField HeaderText="下載">
                <ItemTemplate>
                    <asp:LinkButton ID="lbtnDownload" runat="server" OnCommand="FileDownload" CommandArgument='<%# Eval("File_Path") %>'>
                </ItemTemplate>
            </asp:TemplateField>

Parent.aspx.cs
protected void FileDownload(Object sender, CommandEventArgs e)
{
    string strFile_Path = e.CommandArgument.ToString();
    if (Session["Reason"] == null || Session["Reason"].ToString() == "")
    {
        //showMsg("無輸入原因");
        return;
    }
    else
    {
        //下載檔案
    }
}

參考資料:
http://www.programmer-club.com.tw/ShowSameTitleN/aspdotnet/6117.html

2013年8月19日 星期一

[ASP.NET] 點選GridView內LinkButton透過showModalDialog開啟並傳值給子視窗

說明:點選GridView內LinkButton後,使用JavaScript的window.showModalDialog開啟並傳值到子視窗。使用showModalDialog是因為可凍結母視窗。

作法:
Parent.aspx
<asp:BoundField DataField="File_ID" HeaderText="檔案代碼" />
<asp:BoundField DataField="File_Path" HeaderText="檔案路徑"  />
<asp:TemplateField HeaderText="下載">
                <ItemTemplate>
                    <asp:LinkButton ID="lbtnDownload" runat="server" OnCommand="FileDownload" CommandArgument='<%# Eval("File_Path") %>'>
                </ItemTemplate>
            </asp:TemplateField>

//Parent.aspx.cs
 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
 {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            //使用FindControl找到GridView控制項內的LinkButton控制項
            LinkButton lbtnDownload = (LinkButton)e.Row.FindControl("lbtnDownload");

            string strFile_ID = e.Row.Cells[0].Text;
            lbtnDownload.OnClientClick = "javascript:window.showModalDialog(Child.aspx?File_ID=" + strFile_ID + "', '', 'resizable:no;status:no;scroll:no;dialogHeight:80px;dialogWidth:200px;')";
        }
 }

//Child.aspx
<head runat="server">
    //目標為子視窗自身
    <base target="_self">
</head>
...
<asp:HiddenField ID="hidFileID" runat="server" />

//Child.aspx.cs
 protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString["File_ID"] != null)
        {
            hidFileID.Value = Request.QueryString["File_ID"];
        }
    }

參考資料:
http://toyo0103.blogspot.tw/2012/10/showmodaldialog.html

2013年8月15日 星期四

[ASP.NET] 判斷表單輸入字串是否為數字

1. 以C#語法建立一靜態method判斷字串是否為浮點數值,是則return true。

static bool IsNumeric(object Expression)
{
    bool blIsNumeric = false;
    double dNum = 0;

    blIsNumeric = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out dNum);

    return blIsNumeric;
}

資料來源:
http://support.microsoft.com/kb/329488/zh-tw


2. 使用ASP.NET的 RegularExpressionValidator控制項,在ValidationExpression屬性設定:
整數:^[0-9]*$或^[\d]*$
整數或小數:^[0-9]+\.{0,1}[0-9]*$或^[0-9]{1,}\.{0,1}[0-9]*$或^[\d]+\.?[\d]*$
至少2碼文數字:^[\w]{2, }$


參考資料:
http://jiannrong.blogspot.tw/2009/06/regularexpressionvalidatovalidationexpr.html
http://www.dotblogs.com.tw/wesley0917/archive/2010/12/16/20153.aspx


3. 使用JavaScript的isNaN(x),x為DOM的value




to be continued..



2013年8月8日 星期四

[ASP.NET] 無法修改 Controls 集合,因為控制項包含程式碼區塊 (例如 <% ... %>)。

說明:使用ASP.NET AJAX Control Toolkit控制項,加上有使用MasterPage的關係,
有用ResolveUrl來找js的絕對路徑,所以頁面有<%... %>,
(<script type="text/javascript" src='<%=ResolveUrl("~/js/xxx.js") %>'></script>)
因此出現該錯誤。

解決方式:
將<script type="text/javascript" src='<%=ResolveUrl("~/js/xxx.js") %>'></script>移出<head></head>,個人是放在</html>後(適用不是一開始就要執行的javascript)。

2013年8月7日 星期三

[ASP.NET/JavaScript] Gridview內checkbox無勾選刪除需警告

說明:GridvView提供每筆record勾選CheckBox以多筆刪除,刪除前需有警告視窗,但無勾選任何CheckBox即按刪除button,需顯示無勾選項目。

<script type="text/javascript" language="javascript">
    function CheckBox() {
        //get all input element
        var allInputObject = document.body.getElementsByTagName("input");
        var checkCount = 0;
        for (var i = 0; i < allInputObject.length; i++) {
            if (allInputObject[i].type == "checkbox") {
                if (allInputObject[i].checked) {
                    checkCount++;
                }
            }
        }
        if (checkCount == 0) {
            alert('<asp:Literal ID="Literal1" runat="server" Text="無勾選資料" />');
            return false;
        }
        else {
            return confirm('<asp:Literal ID="Literal2" runat="server" Text="確定要刪除?" />');
        }
    }
    </script>

//刪除button
<asp:Button ID="btnDel" runat="server" Text="刪除" onclick="btnDel_Click" onClientClick="return CheckBox();"/>

[ASP.NET] 使用ResolveUrl找js的絕對路徑

說明: 有使用MasterPage,無法使用相對路徑。ResolveUrl方法是從root目錄出發。


//js放在root/js下
<script type="text/javascript" src='<%=ResolveUrl("~/js/xxx.js") %>'></script>

//css放在root/css下
<link rel="stylesheet" href="css/xxx.css" type="text/css" />

//MasterPage做網站登出
ResolveUrl("~") + "login.aspx"

2013年7月31日 星期三

[ASP.NET] 取得GridView隱藏cell的值

說明:在GridView繫結欄位若設定屬性Visible="false",無法在code behind取得值。

作法:因為GridView事件載入順序是DataBinding->RowCreated->RowDataBound->DataBound,所以在RowCreated與RowDataBound事件內隱藏欄位,還是可以取得cell的值。

protected void GridView_RowCreated(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.Header || e.Row.RowType == DataControlRowType.DataRow)
    {
        //要隱藏的欄位
        e.Row.Cells[0].Visible = false;  
    }      
}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header || e.Row.RowType == DataControlRowType.DataRow)
        {
            //要隱藏的欄位
            e.Row.Cells[0].Visible = false;
        }
    }


2013年6月18日 星期二

單車環島緣起與事前規劃

去年11月進戲院看了不老騎士這部電影,感人熱淚(後來還買了它的書),
想起大學時雖跟同學機車環島過,但無法跟這些勇敢的不老騎士相提並論,
熱血被燃起的我,決定挑戰騎單車環島XDD。


不過直到2月後,才開始去河濱自行車道騎了幾次,
並在2/28入手了一台登山車,不過只騎了不到80km(汗,
雖然沒有特別訓練也沒騎過山路,但just do it~相信年輕就是本錢。

時間不夠下,決定只環東部,因為想騎南迴,所以從屏東枋寮(西部幹線最末站)出發。
並想一個人去流浪,藉此找回工作後逐漸消逝的熱血與感動,而且可依自己步調玩囉。


趁清明連假四天,補足尚缺裝備跟擬定行程:
單車裝備部份:
1. 前燈跟安全帽(必備)
2. 貨架跟側支架(可以用借的)
3. 補胎組、內胎X2與簡易打氣筒(必備)
4. 座墊套與密碼鎖(看個人)
5. 馬鞍袋(跟Mouson大借的,http://ppt.cc/LhBe,剛好他以前跟我同公司XD,超巧)
6. 後來加買攜車袋(應該可以用大黑塑膠袋替代XD)

如果想省錢,單車可以用借的,請參閱http://www.eyetaiwan.com.tw/365/
也可google環島單車出租,我一開始都不知道QQ,不過還是想要有一台自己的車。

隨身物品部份,就看個人囉,我本身沒買車衣車褲(一開始傻傻的),
不過環島過程發現長褲口太鬆會勾到東西,所以穿運動長褲要有束緊帶的。
有買涼鞋在下雨天可穿。可參閱下圖:






行程部份:
參閱網路上環島車友的行程,加上google map來抓里程數,
真的環島時才發現我太天真了,沒有掌握爬山路的坡度
(據mouson大說山路里程數要乘上1.5),就這樣傻傻的硬騎囧,
導致第一天預訂民宿沒住到XD,損失了訂金200元QQ。

anyway就在環島前幾天,匆忙得把裝備跟行程準備好了,
真的要感謝古小姐無怨無悔的付出,還有mouson大的馬鞍袋出借。

對了,有人有興趣環島之後可以找我唷~哈