2017年3月29日 星期三

[習題]ASP.NET動態加入控制項 -- 動態加入TextBox,每寫完一格會自動跳去(.Focus()方法)下一格

Q :  我動態產生了數個 TextBox在畫面上,
    希望每寫完一項(按下Enter鍵),就會自動跳去下一個格(即 .Focus()方法)
    例如:寫完TextBox1,按下Enter,就會自動跳去下一個(TextBox2)....以此類推。
 
      
  
 
A : 要做這件事以前,有不少基本功夫要先打穩馬步 
這個範例應該是初學者不宜。
 
 
關於「動態」產生ASP.NET控制項,您可以參閱我以前整理的文章
 
主要的技巧可以參閱我的書本 -- ASP.NET專題實務(松崗出版)
    上集,第三章的 PlaceHolder
    下集,動態問卷產生系統
 
這些文章在我的網站上也能找到。
 
 
**************************
***  入  門  篇
**************************
如果您連靜態網頁上的、固定的 TextBox都做不到這個功能 --
             寫完TextBox1,按下Enter,就會自動跳去下一個(TextBox2)....以此類推。
 
那也不要指望「動態產生TextBox」....畢竟功力有別。
 
連基本的都做不到,不要想一步登天(不會走,就想飛?)
 
 
HTML畫面上,可以設計五個 TextBox,都設定 AutoPostBack 搭配 TextChanged事件 
 
您當然可以撰寫這種程式啦,我不怪你(畢竟是初學者)
 
一樣可以正常運作
 
////************************************************************************
////****  冗長、重複的程式碼  ****
////************************************************************************
//    protected void TextBox1_TextChanged(object sender, EventArgs e)
//    {
//        TextBox2.Focus();
//    }
//    protected void TextBox2_TextChanged(object sender, EventArgs e)
//    {
//        TextBox3.Focus();
//    }
//    protected void TextBox3_TextChanged(object sender, EventArgs e)
//    {
//        TextBox4.Focus();
//    }
//    protected void TextBox4_TextChanged(object sender, EventArgs e)
//    {
//        TextBox5.Focus();
//    }
 
但你有沒有發現這種寫法,程式碼幾乎一模一樣,不能濃縮一下,好可惜。
 
我把所有的 Textchanged事件指向同一個,比較簡單
(請看書本上集第三章的介紹,我上課會教。這是重點!)
        1.<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
        <br />
        2.<asp:TextBox ID="TextBox2" runat="server" AutoPostBack="True" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
        <br />
        3.<asp:TextBox ID="TextBox3" runat="server" AutoPostBack="True" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
        <br />
        4.<asp:TextBox ID="TextBox4" runat="server" AutoPostBack="True" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
        <br />
        5.<asp:TextBox ID="TextBox5" runat="server"></asp:TextBox>(不設定、沒事件)

 
後置程式碼如下,改成VB語法應該很簡單吧。 
    protected void TextBox1_TextChanged(object sender, EventArgs e)
    {
        // 為了避免重複寫多個 TextBox的 TextChanged事件,而內容幾乎一樣,所以改成這樣。 
        TextBox TB = (TextBox)sender; 
        if(TB.UniqueID.Length == 8)
        {
            String ID_no = TB.UniqueID.Substring(7, 1);
            // 抓取 TextBox ID最後的流水號,例如 TextBox「1」
 
            TextBox TBnext = (TextBox)Page.Form.FindControl("TextBox" + (Convert.ToInt32(ID_no) + 1).ToString());
            //上集 第十八章的範例有提到,多重檔案、批次上傳。
            TBnext.Focus(); 
        }  
    }
    
    
這裡也用到我慣用的技巧 -- 字串相連與流水號 

OK,如果程式會跑了,那我們把範例改呈「動態」產生 TextBox再來試試看 
 
**************************
***  進  階  篇
**************************
牢記前輩給我們的指導:
      動態加入控制項,可以寫在 Page_Init事件裡面
      想拜師學藝的,可以參閱這一班 -- ASP.NET動態套版班 http://www.dotblogs.com.tw/mis2000lab/archive/2013/09/02/116064.aspx       
    protected override void OnInit(EventArgs e)
    {
        for (int i = 1; i <= 5; i++ )
        {
            TextBox TB = new TextBox();
            TB.ID = "TextBox" + i;
            TB.Text = "動態產生" + i;
            TB.AutoPostBack = true;
 
            TB.TextChanged += new System.EventHandler(this.TextBox1_TextChanged); 
            // HOW TO:在執行階段時動態繫結 ASP.NET Web 網頁中的事件處理常式
            Page.Form.Controls.Add(TB); 
        }            
        base.OnInit(e);
    } 
 
至於 TextBox1_TextChanged事件跟上一個範例一樣,COPY過來就能用。在此不贅述。 
 
 
 
可能的 Bug與改進方式:
...................................................................................................................................
     關於 .Focus()方法,雖然ASP.NET也有提供,但 Server端的語法會導致畫面一直閃爍(PostBack)
 
    改用 JavaScript也可以做到,並解決這個問題 
    ASP.NET搭配 JavaScript可以參閱這篇文章:http://www.dotblogs.com.tw/hatelove/archive/2009/10/28/11325.aspx
 
或是

黯然銷魂 之 網頁繪製圖表 Google Charts with JavaScript....與ASP.NET網頁結合 (ClientScriptManager.RegisterStartupScript 方法)

...................................................................................................................................
 
這個問題是讀者來信詢問,我臨時寫出的範例
分享一點想法,給大家參考(或許是一個方向) 
沒法保證  100% OK,或是 您COPY去用一個字都不用改
更沒法保證範例 "絕對" 完美囉
   
範例下載: 
 
相關的文章:

[習題]念念不忘的「按下Enter」送出,Form表單的 DefaultButton屬性

這一週連續有兩讀者來詢問相同的問題
課堂上也有人問起

說真的,我未曾遇見過這種要求,可能我的User都比較好講話吧

今天我請教了一位 資深的技術高手,才學到這一招
為我自己的學習作一個紀錄,也可以將來作為教材


問   題:
=============================================
輸入文字之後,我要按下鍵盤的 Enter按鍵,而不要按下畫面上的 Button按鈕

當畫面上有多個Button時,我按下 Enter按鍵
不一定會觸發我想要動作的那個按鈕?
怎麼辦?

 
     
上圖裡面,我們可以發現:
      有一個按鈕被「藍色框框」給標示起來,你按下 [Enter]按鍵就會觸發他,而不是你想要觸發的 Button2
      我是用IE 9.0來看執行成果。

另外,讀者回報說:他用IE 8.0來看,所有Button按鈕統統被「藍色框框」給標示


解  決:
============================================= 
     
  
這篇文章,我打好後,突然消失了
只好重打一次

回家打字,因為家裡的電腦是我太太用的
輸入法(挑字、習慣字)都跟我有很大差異
我很難挑到正確的字
月打字月生氣......我也不想訂正錯字了
大家忍耐一點

重新打字,很多話也不想重打了,就簡略帶過了。真抱歉


網路上的相關文章:

 
 
我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson
寫信給我--  mis2000lab (at) yahoo.com.台灣  或是  school (at) mis2000lab.net
................   facebook社團   https://www.facebook.com/mis2000lab   ......................
................   Google+   https://plus.google.com/100202398389206570368/posts ........
................  YouTube (ASP.NET) 線上教學影片  http://goo.gl/rGLocQ

2017年3月27日 星期一

[職場] (不負責任講座) PM 小哉問? ...... PM的工作是作什麼?

不敢說是「大哉問」,
我也不敢說我的說法正確。

因為不同的領域、不同的公司、不同的客戶,都會有不同的要求。......難有定論!


PM通常分成 Product Manager,但我們作軟體專案的,通常是 Project Manager。


PM最重要的工作,就是 On Schedule。......一位前輩跟我說:PM的工作就是「跟催」,很寫實的答案。
所有項目都要按表操課,準時交付。

說真的,很簡單。


但是,回頭想想,裡面有些玄機在:

第一,需不需要懂技術?
      如果完全不懂技術,很可能客戶會亂開一堆規格,除了成本增加以外,難度提升就很難結案。
      如果太執著在技術,常會變成「你不懂啦!這不可能做到!」.....會議上這樣說,客戶會很不爽。

      有時候,PM覺得作得到,但底下的RD覺得不行。
      PM甚至要幫忙提供一些解決方案。


第二,寫文件。
      不同公司有不同的流程與稽核,會有寫不完的文件。
      不過,這些東西照著公司規定來走就好。
    
      很花時間,但也還好(跟人與人的溝通相比,我覺得寫文件不過是花時間而已)


第三,權責區分......我想說:"任勞任怨"或許更貼切!
      客戶講了需求,也提供文件了。怎麼RD寫出來的東西跟客戶要求不同?
      RD覺得很委屈啊,「我就是照規格來寫,怎麼會是我錯?」
      測試人員找到 Bug,PM要請RD劃押(何時能解?能解多少?解不了的是否設為「限制」,下一版再說?)

      前面說到 PM的工作是 On Schedule,所以時時開會或是確認每個進度,是免不了的工作。

      不過,人生哪有這麼順利的?

      客戶遇見問題,他會自己判定「這是MIS要負責?這是軟體出錯?這是流程錯?這是DB的問題?」嗎?
      不會!真的不會!

      客戶電話或是 E-Mail只有一個出口,只有一個聯絡人,就是PM。

      該如何確定問題點?該找誰幫忙?何時能解?
      都是PM的事!......客戶只想知道「結果」,過程不關他的事。
    
      所以不要擺出高姿態,PM不是主管。
      不要擺出主管的架子,覺得我是PMㄟ!我怎麼能作這種事!

      「沒有什麼事不能作的!」,是的!姿態放低一點,就是「打雜」。

      RD有問題,寫不下去,PM難道不用出面找大家(如:客戶)釐清一下?
      客戶有問題,不知道找誰,當然也就會找PM求援?

      越愛擺姿態、自己為是高階主管、會挑高級的管理工作來作.....這種PM通常死得很慘。


因為....即便是PM,上頭也有老闆的,

RD、客戶、參與專案的所有人,一旦擺不平,或是不爽(甚至事情拖太久沒回音)
就會抓狂、找PM的老闆出來講(台語:踹共)!


這時候一切都完了。



所以,作一個總結吧:

PM的工作,就是介於「客戶」與「老闆」之間,別讓自己的過錯讓老闆背黑鍋!
PM的工作,就是介於「外部問題(專案)」與「內部資源(同仁)」之間,別讓兩造雙方都不爽!
PM的工作,就是介於「問題」與「解決」之間,必須自己調配資源來處理!
當這個問題不明確,我們出面擺明它,進行確認!
當這個問題沒人負責,我們出面找資源處理它(有時要跟老闆回報、或是爭取更多資源)。
當這個工作沒人管,我們就要出面分配(或是自己作)。



「上善若,水利萬物而不爭」,我很喜歡這個形容。

      很多人說,"我很懷念RD的生活,我只要每天把我的事做完就好。"
      相對起來,PM的工作很繁瑣,難有界線

那條界線,很難訂出規範。
能擴大,卻不能縮小
介於「客戶、團隊同仁、老闆(公司)」三者之間......時時在變化,從來沒有定下來的一天

所以我想說,PM 要像水一樣,把大家都圍起來!
有不明確的地方,我們要出面處理


不過,

      當我們願意 扛起責任,薪水、職務、團隊的敬重、客戶的體諒....自然就會水漲船高(成正比)。

      老闆畢竟是花錢請人來幫他分憂解勞的,客戶與同仁也只想跟「處得來的人」共事

      也就因為工作內容很難訂出界線、很難說「要」還是「不要」?.......所以需要經驗累積,沒法被模仿。
      越是難有界線的工作,越有可能領好的薪資。


想想看:
當我們面對客戶的一個問題,您心裡的第一個聲音是什麼?
(a).  為什麼找我?為什麼這是PM要作的事?
(b).  我找哪些資源解決?
您的答案,決定您的身價!



PM的三個評量點,大概就是「客戶滿意度、團隊同仁向心力(減少人員流動與離職)、老闆被客戶罵的次數
      前兩者越高越好,
      後面一項,能免則免。




最後作一個補充:
有人的地方,就有江湖!......語出電影「東方不敗 第二集,風雲再起」

人,是最難處理的問題
所以.....我的建議是:有空多念經、多拜拜、或是多跑教堂。真的很有幫助!

我們人跟人之間「喬不定」的眉眉角角、恩怨糾隔、前因後果、冤親債主、累世宿怨...等等,
透過神明的力量(念經、祈禱等等宗教力量),很快就能搞定。
不過,平時就要心存善念、走正途......不然,神佛也不想幫忙喔。


補充文章:

台灣因為大部份公司都沒有PM的長期職涯規劃,所以大家其實該提早為自己打算。我的觀察是45歲前後,你若沒有找到下一個出口,就會開始覺得感受到職涯的瓶頸了。



數位時代網站|撰文者:極客公園   發表日期:2014-02-13
(點選圖片可以連到原網址)

董大偉老師的文章:PM,你必須真的在乎團隊才行
                             http://studyhost.blogspot.tw/2014/07/pm.html
引述:
......好啦,基本上,這就是一個大家都知道不會實現的時程,這根本是一個不會完成的目標,而當老闆(和客戶)把這個目標壓給PM時,PM如果肩膀不夠硬,直覺反應的動作就是壓到團隊的身上再來看看,但...這樣真的有用嗎?

......用壓迫的方式讓團隊趕在某一個不可能的時程來完成,就好比教練和領隊暗示著球員吃禁藥上場一樣,這是毀掉一個團隊最好的方法之一。


我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson
寫信給我--  mis2000lab (at) yahoo.com.台灣  或是  school (at) mis2000lab.net
................   facebook社團   https://www.facebook.com/mis2000lab   ......................
................   Google+   https://plus.google.com/100202398389206570368/posts ........
................  YouTube (ASP.NET) 線上教學影片  http://goo.gl/rGLocQ