2012年3月28日 星期三

ASP.NET 神奇FindControl方法

說到ASP.NET最常用的方法,FindControl一定有被提名

平常在用沒什麼就這樣就OK


TextBox tb = this.Page.FindControl("TextBox1") as TextBox;

之後想幹嘛就幹嘛

但是如果有套用主版頁面的話這方法就失靈囉,總是見到怒毆大神,然後就怒毆電腦

正解如下


TextBox tb = this.Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1") as TextBox;

先用 this.Master 選到主版,在慢慢向下一層層找

對,這方法很邪門不像 WinFrom 的 Control.ControlCollection.Find 方法,有第二個參數

對於有套主版或者像是 GridView ItemTemplate 裡面的都無法找到

假如有2個都叫TextBox1的鬼東西

一般得這麼做才能對他操作

如果還有用巢狀主版的話,好不好玩?

佐藤ポヨ表示:自己寫個 擴充方法 吧

在類別庫建立個靜態類別寫擴充方法

擴充方法細則參閱MSDN

把類別加入參考後,Control 就能用 doFindControl 跟 doFindControls 擴充方法

使用方式

好啦,地獄兩百層的控制項也能Find了

C# 拋棄switch 以方法名稱 動態應用

對物件導向開始懵懵懂懂之後,寫程式就會把重複的程式碼抽出來寫成一個方法,需要使用的地方就呼叫方法即可

但是有時候會面臨不同情況得用不同方法的時候

如果這樣寫當然OK,但是兩年後如果還在寫程式,回頭看到一定會會心一笑


if (條件A) {
    doSomethingA();
}
if (條件B) {
    doSomethingB();
}
if (條件C) {
    doSomethingC();
}

如果不能忍受很多 if 可能會變這樣


switch (條件) {
    case A:
        doSomethingA();
        break;
    case B:
        doSomethingB();
        break;
    case C:
        doSomethingC();
        break;
}

如果方法有一萬種呢?case一萬次就好了嘛

老疆表示:好不好玩?

 

 

 

 

歐弗寇斯納特


using System.Reflection; //引用

public partial class testCallMethod : System.Web.UI.Page {
    protected void Page_Load(object sender, EventArgs e) {

    }
    protected void Button1_Click(object sender, EventArgs e) {        
        //MethodInfo mInfo = typeof(testCallMethod).GetMethod("doSomethingB");//亦同
        MethodInfo mInfo = Type.GetType("testCallMethod").GetMethod("doSomethingB");
        mInfo.Invoke(this, null);
    }

    public void doSomethingA() {
        //...
    }
    public void doSomethingB() {
        //...
    }
    public void doSomethingC() {
        //...
    }
}

以上

2012年3月27日 星期二

C# 拋棄switch 以列舉名稱 動態應用

列舉的好處在於使值可命名具有意義

例如


TextBox1.ForeColor = Color.Yellow;

如果想讓使用者自己改顏色,不用多想很自然會放個下拉選單

固定幾個不會變動的話,就直接把項目add進items


DropDownList1.Items.Add("Red");
DropDownList1.Items.Add("Blue");
DropDownList1.Items.Add("Green");

...

選完之後呢就用switch


switch (DropDownList1.SelectedValue) {
    case "Red":
        TextBox1.ForeColor = Color.Red;
        break;
    case "Blue":
        TextBox1.ForeColor = Color.Blue;
        break;
    case "Green":
        TextBox1.ForeColor = Color.Green;
        break;
}

 

 

 

 

等等...如果我要把所有顏色都列出來呢?

難道有幾個顏色就case...

歐弗寇斯納特


//將列舉名稱加入下拉選單
protected void Page_Load(object sender, EventArgs e) {
    if (!IsPostBack) {
        //列舉型別 KnownColor 已知的系統色彩,Color 是結構型別
        foreach (string name in Enum.GetNames(typeof(KnownColor))) {
            DropDownList1.Items.Add(name);
        }
    }
}
//將下拉選單值取出並給物件屬性設定列舉值
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) {
    TextBox1.ForeColor = Color.FromKnownColor((KnownColor)Enum.Parse(typeof(KnownColor), DropDownList1.SelectedValue, false));
}

以上

2012年3月26日 星期一

SQL 從查詢結果中範圍筆數顯示 分頁查詢

如果查詢結果有一千萬萬萬萬..............筆,你想要全部顯示的話,就用select * from product

如果你還正常,你會用select Top 10 * from product 一次只顯示10筆

那第二頁呢?

...

簡單,套件無雙開了,GridView分頁開落去

但是聽說GridView的分頁其實是把全部查出來才去慢慢分頁的...

SqlDataSource Performance

你的客戶受不鳥效能差 所以把手機關掉就好了 小客戶你欺負他

但是 大客戶他欺負你

sql如何返回第三或从第三条记录开始返回(分页问题)?

至於怎麼把結果變成分頁自己找迴圈打滾吧

孟克表示:

但是如果你的客戶是小客戶...你知道的。

2012年3月23日 星期五

JQuery querystring 取值

ASP.NET使用querystring如吃飯喝水

後端接值就用 Request.QueryString["id"]

那前端勒?

說穿了就不神秘,自己從location.href字串切割自然可得

但是十大叩頂守則第一條有說

在自己寫之前...

先借助網路力量!!

透過 jQuery 抓取網頁 URL 的參數

效果

程式碼備忘

把jquery.url.js丟上網頁link 使用時用下面這句


$.url.param("id")

jquery.url.js



/*
jQuery Url Plugin
 * Version 1.0
 * 2009-03-22 19:30:05
 * URL: http://ajaxcssblog.com/jquery/url-read-get-variables/
 * Description: jQuery Url Plugin gives the ability to read GET parameters from the actual URL
 * Author: Matthias Jäggli
 * Copyright: Copyright (c) 2009 Matthias Jäggli under dual MIT/GPL license.
*/
(function ($) {
 $.url = {};
 $.extend($.url, {
  _params: {},
  init: function(){
   var paramsRaw = "";
   try{
    paramsRaw = 
     (document.location.href.split("?", 2)[1] || "").split("#")[0].split("&") || [];
    for(var i = 0; i< paramsRaw.length; i++){
     var single = paramsRaw[i].split("=");
     if(single[0])
      this._params[single[0]] = unescape(single[1]);
    }
   }
   catch(e){
    alert(e);
   }
  },
  param: function(name){
   return this._params[name] || "";
  },
  paramAll: function(){
   return this._params;
  }
 });
 $.url.init();
})(jQuery);






N 年後的今天(2015/01/08)發現 中文 TMD 會亂碼耶

把 unescape 改成 decodeURIComponent 即可





另一種選擇:js-url

2012年3月21日 星期三

與使用者控制項的激戰系列 第二彈 ListBox MouseHover Select 事件

一般的ComboBox展開下拉選單後 會隨滑鼠移動反白項目

但是ListBox沒這能力

自己寫

要點在於是用MouseMove事件

效果同ComboBox

2012年3月20日 星期二

超好用又超難用的 BindingSource

BindingSource 好用的地方 在於查詢完 結果丟進去 什麼鬼控制項都能跟他Binding一起 又有好用的position讓你上上下下

但是當你想要效仿datagridview從中抓ColumnName啦 抓Row啦 抓Items啦之類的東東之時 你會發現

但是本人就是想這麼幹,BindingSource丟給datagridview它讀的懂,自然沒道理無法直接拆解來用

使出第一百零一招 請出好朋友估狗 未果 查到的不是火星文 就是沒關係的東東

只好亂打嘗試錯誤法 + 偵錯

偵錯的結果果然有法子在某個地方找到想要的東東

上圖是誤導的 沒藏那麼深 -.-

解答是被包裝成DataView 先轉型在從中foreach即可

2012年3月17日 星期六

網頁控制技術 記錄備忘

以應用程式來對網頁進行取值 控制 操作 自古以來本人就略感興趣

抓值的話一開始什麼都不懂直接拿整份HTML文件自己寫迴圈解析字串

但是HTML又非人人以標準撰寫 所以時而可行時而失敗

直接對網頁作控制更是百思不得其解

寫程式的莫非定律 - 你想不到的別人未必想不到 你想得到的別人都已經想到了 =3=

咕狗老師教教我 立刻就給我回答了 還省下一條肉乾當束脩

式門遁甲 - (C#)用WebBrowser控制項寫網頁抓取程式之一些心得

一個webBrowser 一個button

button按下

與使用者控制項的激戰系列 第一彈 Form標題click事件

外表看似簡單 難度卻異於常人 的控制項comboBox

comboBox本身當然沒什麼好難的

但是如果想要用 TextBox + ListBox + Button 硬是湊成一個偽comboBox卻沒想像簡單

光是標題就是難題了

什麼意思呢? 舉例來說這是一個comboBox展開下拉的狀態

如果這時候點了Form標題 他就把下拉選單收合起來

那好了要怎麼在Form觸發點擊標題的事件?

事實上的答案就是 - 辦不到

因為打內法蘭克先生根本沒處理標題的事件

預設form的mousedown mouseup mouseclick事件 也都是在點擊標題列下面的區域才能觸發 與標題無關

此時膜拜csdn

http://topic.csdn.net/u/20091015/11/56540da1-3c57-487f-9f31-2e1c60c1813c.html

四樓表示這裡都是都是放牛的人 十分牛B

 

 

 

 

以下備忘記錄



        private void Form1_Load(object sender, EventArgs e) {
            this.TitleClick += new EventHandler(Form1_TitleClick);
        }

        void Form1_TitleClick(object sender, EventArgs e) {
            listBox1.Visible = false;

        }

        /// <summary>  
        /// 消息处理  
        /// </summary>  
        /// <param name="m"></param>  
        protected override void WndProc(ref Message m) {
            //系统消息
            if (m.Msg == 0x0112 && m.WParam.ToInt32() == 61458) {
                if (TitleClick != null) TitleClick(this, null);
            }
            base.WndProc(ref m);
        }
        public event EventHandler TitleClick;


2012年3月15日 星期四

C# 神奇大括號

經張小豪同學從芳芳獲得的範例中,發現一行神奇語法,看了半天不知是什麼

後來經過嘗試錯誤後發現真相

其實也沒什麼好神奇的,就是一種寫法而已

如果要 扭一個踢克斯霸克斯 通常會這麼寫

神奇大括號就是,new完之後直接 {屬性1 = 值1, 屬性2 = 值2} 所以可以寫這樣

效果都一樣

Join外的新選擇 - 多重From

借助先人的力量時總會有些新發現

黑暗執行緒:在LINQ中實踐多條件LEFT JOIN

文章中提到的LINQPad,還誠彼娘之超級強 -.-

用過的就會覺得自己寫LINQ 再自己猜猜SQL是什麼的行為像個傻B

以下正題

以往要多表複合喇作夥的時候你會這樣寫

但是其實這樣寫查到的結果也一樣

個人認為後者的寫法還比較容易閱讀理解

第一行明確的知道要顯示什麼欄位

第二行明確的知道要FROM哪幾個TABLE

真要說缺點的話,就是沒有什麼 左舊影 右舊影 交叉舊影 可以用

 

 

 

 

順帶附上LINQ比較

2012年3月10日 星期六

最新版 怪獸查詢

除了頭像之外的欄位都能拿來當作查詢條件

字串以LIKE查詢

數值 日期 能夠以 等於、大於、小於、介於 此四種方式查詢(大於等於、小於等於 等方式則無法)

唯一缺點是資料庫內不能有NULL值

2012年3月3日 星期六

一秒看破 - 三層式架構 物件導向程式設計 - 以ASP.NET實作

最終效果簡單到爆炸,只有一個GridView查詢

其實只寫了兩層,因為根本沒商業邏輯

類別庫記得加入參考跟Using

程式碼

Default.aspx

Default.cs

doQuery.cs

Product.cs

懶得說明,其實各個單位部分的程式碼肯定都是作業也有的,應該不可能看不懂,如果你真的有乖乖寫作業的話...

想知道實際運行怎麼跑就在建構子下中斷點一行一行看吧

 

 

 

 

大放送,完整方案檔

http://www.mediafire.com/?il6npbizwx5a47h

PS.mediafire該網站用了超級強大的AJAX效果(ex.多檔拖曳上傳 課製右鍵選單 進度條 檔案管理) 想體驗的人可以申請帳號試試

2012年3月1日 星期四

蝴蝶效應

當初SQL欄位隨性設計

怪獸查詢隨意JOIN

第一次苦頭,在GridView顯示的時候全部重寫排序 -.-

之後又要拿出GridView的值來自定義顯示

WTF,GridView.Columns 一個順序, DisplayIndex 另一個順序

只好用個Dictionary放這兩個值,再用個List來排序,再從Dictionary取值 囧rz

簡單功能,超複雜寫法...