顯示具有 使用者控制項 標籤的文章。 顯示所有文章
顯示具有 使用者控制項 標籤的文章。 顯示所有文章

2013年7月13日 星期六

將VB6 轉換(升級)成 VB.NET

  因專案需要將VB6 開發的應用程式轉換到 .NET,原本打算重新撰寫,可是改寫一樣需遵照原來的作業邏輯,單單重新設計表單及選擇替代的元件所花的時間可能就不短,最後嘗試就利用 VS2008 的專案轉換功能,將VB6轉案直接升級到 .Net 2.0。

專案轉換後,雖然程式碼中有些必須升級或改寫的地方,但 forms 的設計都沒有問題,可是把專換後的專案複製到家裡的環境時,卻有部分 Forms 出現下列錯誤:

類別未登錄 (發生例外狀況於 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))


  奇怪!奇怪! 原本以為是漏COM檔案,可是一再比對,檔案並沒有少啊! 上網找,都說是因為 VS的編譯設定的問題,只要將編譯目標改成 x86 就可以(詳參考:http://www.dotblogs.com.tw/hung-chin/archive/2011/07/30/32306.aspx),可是照改之後,問題依舊。

  仔細看錯誤的地方,VS 報錯是在這一行;
 Me._SSTab2_TabPage0.Controls.Add(Me._mctPic_0)

  有問題的是 _mctPic_0 這個變數沒有定義,找到定義這一行:
 Me._mctPic_0 = New AxMSChart20Lib.AxMSChart

應該是 AxMSChart20Lib.AxMSChart 這個元件的問題,上網查的結果,AxMSChart20Lib.AxMSChart 是在  mschrt20.ocx 裡。

  所以,只要將  mschrt20.ocx 複製到 System32 (如果是 64bit 的Win7 就複製到 SysWOW64 裡),然後以系統管理員身分開啟 cmd ,並切換到 System32 (64 bit是切換到 SysWOW64),然後執行
regsvr32 mschrt20.ocx

問題解決了!

所以,縱使相同的錯誤息訊,也可能是不同的起因!

2013年4月8日 星期一

利用JavaScrpt 對 AjaxControlToolkit 之 TabContainer 做頁籤收展

之前開發一支資料登錄系統,為了方便使用者依收到資訊階段順序來鍵錄資料,因此將各階段的欄位利用 TabContainer 元件予以群組,使用者點按頁籤就可以切換到各階段的登打畫面。

經使用者試用後,使用者要求在列印時可不可以不用分頁籤一頁一頁印,而是可以展開頁籤,一次列印所有資料。

由於個人學藝不精,不知 TabContainer 是否有提供控制籤頁收展的功能,所以就用 JavaScript  寫一個前端的控制收/展功能。

說明:
TabContainer 在輸出到 Browser 時,會自己生成一個 DIV 並用「ajax__tab_header」這一個 class 做為頁籤的容器,及對應頁籤生各個裝載欄位的DIV,並用「ajax__tab_panel」這個 class

JavaScript 就是利用上面提到的「ajax__tab_header」及「ajax__tab_panel」來對頁面做隱藏或顯示,以達到收/展的要求:
<script type="text/javascript">
        function getElementsByClassName(className, parentElement){
                      var elems = document.body.getElementsByTagName("*");
                      var result=[];
                      for (i=0; j=elems[i]; i++){
                            if ((" "+j.className+" ").indexOf(" "+className+" ")!=-1){
                                    result.push(j);
                            }
                       }
                      return result;
          }
                       
         function setTab(tag)
                        {
                            //debugger
                            var hTab=getElementsByClassName("ajax__tab_header");
                            var tTab=getElementsByClassName("ajax__tab_panel");
                            if(tag==0)
                            {
                                for(i=0;i<hTab.length;i++)
                                {
                                    hTab[i].style.display="none";
                                }
                                for(i=0;i<tTab.length;i++)
                                {
                                    if(tTab[i].className=="ajax__tab_panel") {
                                      if(tTab[i].style.visibility!="visible")
                                         tTab[i].style.visibility="";

                                      tTab[i].style.display="block";
                                    }
                                }
                                document.getElementById("Button1").style.display="none";
                                document.getElementById("Button2").style.display="inline";
                                                                   
                            } else {
                                for(i=0;i<tTab.length;i++)
                                {
                                    if(tTab[i].className=="ajax__tab_panel") {
                                       if(tTab[i].style.visibility!="visible") {
                                        tTab[i].style.display="none";
                                        tTab[i].style.visibility="hidden";
                                      }
                                    }
                                }

                                for(i=0;i<hTab.length;i++)
                                {
                                    hTab[i].style.display="block";
                                }
                               
                                document.getElementById("Button2").style.display="none";
                                document.getElementById("Button1").style.display="inline";
                            }
                        }
                    </script>

<input id="Button1" type="button" value="關閉頁籤" onclick="setTab(0);" style="display:inline"/>
<input id="Button2" type="button" value="啟用頁籤"  onclick="setTab(1);" style="display:none" />
由於控制收/展是在 Browser 端,所以原來後端的處理程式都不用修改,只要在 .ASPX 網頁適當位置插入上列程式碼即可!

2011年10月19日 星期三

存取控制項 ClientId 或 UniqueId 會造成 __PostBack 動作不正確?

這個問題原來不是只有我遇到,國外也有人遇到相同的現象,但都沒有很好的解法

http://forums.asp.net/t/1229919.aspx/1/10

UpdatePanel: __doPostBack('MyControl.ClientID') does not cause partial postback...why?

原由:我想利用DataGrid提供使用者進行 DataTable資料維護,其中有一欄位是日期,所以想在DataGrid中加入「日曆」功能,因為資料繕打是在 Clinet端,為了減少 PostBack的次數,所以不想用Server Controller的日曆,就利用DataGrid樣板功能,將其中一個資料欄轉成TemplateField,並在裡頭加入 Html控制項
(.aspx 部分程式)
<asp:TemplateField ....>
<EditItemTemplate>
<asp:TextBox ID="MilesDate" runat="server" Text='<%# Bind("MilesDate", "{0:yyyy/MM/dd}") %>' ></asp:TextBox>
<asp:ImageButton alt="" src="Images/im_calendar.gif" id="MilesDate_calendar" runat="server" />
</EditItemTemplate>
<ItemTemplate>
.....
</asp:TemplateField>

在後端的程式碼中加入:
protected void MileStoneMaintain_RowCreated(object sender, GridViewRowEventArgs e)
{
TextBox MilesDate = (TextBox)e.Row.FindControl("MilesDate");
ImageButton MilesDate_calendar = (ImageButton)e.Row.FindControl("MilesDate_calendar");
if (MilesDate != null)
{
MilesDate.Attributes.Add("Readonly", "readonly");
MilesDate.Attributes.Add("rel", "MilesDate");

MilesDate_calendar.OnClientClick= String.Format("newCalWindow('/SuperHall/Index.htm', {0}.{1}.value,'Objfield={0}.{1}');return false;", Page.Form.Name.ToString(), MilesDate.ClientId.ToString());
}

程式執行後,按下Grid上的「編輯」確實進行編輯模式,但「更新」確無作用,如果上面綠色那一行註解掉,就正常,但日曆控制項就不能用。

後來追蹤發現是因為 MilesDate.ClientID 造成的,雖然同事建議我改用 UniqueID,但結果一樣,可以查看在瀏覽器上的原始碼:
如果不用 ClientId,MilesDate會轉換成
<input name="MileStoneMaintain$ctl04$MilesDate" type="text" value="2011/11/15" id="MileStoneMaintain_ctl04_MilesDate"

可是加上 ClientId 之後:
<input name="MilesDate" type="text" value="2011/11/15" id="MilesDate"

明顯看出兩者前後的差別。

而最絕的是「更新」,在沒有使用 ClientID時:
<a href="javascript:__doPostBack('MileStoneMaintain$ctl05$ctl00','')">更新</a>

使用 ClinetID時,竟變成:
<a href=
"javascript:__doPostBack('ctl00','')">更新</a>

難怪輸入的資料不能更新!!!!


後記:
不要以為在程式碼中使用 ClientID才造成這個問題,如你在 Debug,想用 監看式來查看 ClientID的內容,也會造成上面的現象,千錯萬錯是 ClientID的錯,絕不是你的程式寫錯了!

因為我只有 VS2008,這個問題並沒有在 VS2010上進行確認,如果有人結果,煩請通知!

2010年5月15日 星期六

使用者控制項-編譯沒錯誤,但執行不到










自行開發的使用者控制項,在重建方案時,皆無錯誤訊息,之前還可以執行、追踨,可是調整功能後,突然執行不到,Debug 時,Page_Load 不到執行到 控制項內。

處理方式:
將 控項項的 ~.designer.cs 刪除,然後在 ~.ascx 上按右鍵,重新選擇「轉換為WebForm」,VS 即可重新產制 ~.designer.cs

======= 完畢 =========