2013年11月28日 星期四

Application has encountered a problem and needs to close. We are sorry for the inconvenience.

Q:
以VB.net撰寫的程式,有一天在英文視窗下執行,突然出現以下錯誤訊息:
XXX.exe has encountered a problem and needs to close.  We are sorry for the inconvenience.
但在其他語系的視窗執行正常,且切換至英文介面亦無問題。



A:
經測試,只要把en目錄改名,程式又正常了,只是缺乏英文介面,因此判斷是en目錄下的XXX.resource.dll 壞掉了,經兩整天的除錯,最後依下列步驟解決了:

  1. 初步判斷式表單的翻譯檔壞掉,因此決定將英文語系的翻譯檔暫時拿掉,但因表單很多,要全部移除,再一一加入專案測試,恐怕很費事,且由於程式一開始就當掉,因此先從程式首先載入的表單著手,果不其然,就 Bingo了。
  2. 移除語系檔的方法是先將FFF.en.resx檔案移走,再編輯XXX.vbproj檔,搜尋 FFF.en.resx,將整段移除。
  3. 重新編譯並執行,如果執行無誤,那就是那個檔壞了。
  4. 之後再把步驟3還原回去,恢復原來樣貌,並在Visual Studio 開啟 FFF form,並切換至英文語系,若出現錯誤訊息,那就表示找到了。
  5. 再做一次步驟3,並開啟 FFF form切換至英文語系,已產生一個新的英文語系檔案,重新翻譯即可。
注意,若你從Visual Studio 開啟 FFF.en.resx檔,並不一定會出現錯誤,必須將表單切換至對應之語系,才會出現錯誤畫面。 

2013年11月21日 星期四

ClipBoard.SetText出現亂碼

Q: 在英文視窗下,以.net 呼叫ClipBoard.SetText出現亂碼.
A:
ClipBoard.SetText(str, TextDataFormat.Text ) 作業系統會將字串轉成預設語系之字串,故中文字會被截成1個byte.
若將參數拿掉如下,就會正常.
ClipBoard.SetText(str)

2013年11月20日 星期三

設定網頁操作模式相容於舊版IE

由於瀏覽器不斷更新,也造成網頁程式在不同版本上執行出現問題,如果要逐一解決問題,IT人員恐怕會夜不安眠吧,幸好,MS IE提供一種簡易解法,可將網頁向下相容於舊版IE,這樣,就算使用者以新版IE執行,它也會以網頁所設定的版本解析HTML/Javascript,經測試結果好像還不賴。

處理方法很簡單,只要在網頁的段落內加上下列宣告,就搞定了。
<meta http-equiv="X-UA-Compatible" content="IE=7" />
如果網頁眾多,建議在主版網頁(Master Page)內宣告,就一勞永逸了。

2012年5月7日 星期一

Q: How to implement Multi-threading?
A: 
1. Simple

Module Module1

    Sub Main()
        For i As Integer = 1 To 10
            ' create a thread and run
            Dim obj As New Threading.Thread(AddressOf ThreadMethod)
            obj.Start()
        Next
        Console.ReadLine()
    End Sub

    ' the running method in every thread
    Sub ThreadMethod()
        Console.WriteLine(Now)
    End Sub
End Module
2. With Parameters : add Sub() before the method in Thread object initialization
Dim obj As New Thread(Sub() SaveImage(url, mFileName))
obj.Start()

...

    Public Sub SaveImage(url As String, mFileName As String)
        'Public Sub SaveImage()
        'Dim url As String, mFileName As String
        Dim objWebClient As New WebClient

        objWebClient.DownloadFile(url, mFileName)
        Console.WriteLine(url)
    End Sub

2012年4月15日 星期日

ASP.net Menu 在 IE9、Google Chrome、FireFox 內執行出現空白

Q: ASP.net Menu 在 IE9、Google Chrome、FireFox 內執行,下拉式選單出現空白
A: 在母版網頁的內加一行如下:




or


2011年12月26日 星期一

XML 解析

Q: 讀入一個字串,如何取出節點的值?
A:
Dim xmltext As New System.Text.StringBuilder
Dim strReader As StringReader = New StringReader(mXml)
Dim reader As XmlTextReader = New XmlTextReader(strReader)
Dim docNav As New XPathDocument(reader)
Dim objxPath As XPathNavigator = docNav.CreateNavigator
Dim objNode As XPathNavigator = objxPath.SelectSingleNode("/")
Return objNode.Value

2011年6月13日 星期一

DataSet Tips

DataSet 是一個儲存在記憶體內的資料庫,它擁有很多類似資料庫的操作功能,例如:

1. 兩表合併(Merge Table)
Table1.Merge(Table2, False)
有時候,這個方法會因為資料結構造成失敗,此時可改用DataRelation,將兩個Table Join。
Dim mDataRelation As New DataRelation("TempJoin", Table2Columns, Table1Columns, False)
ds.Relations.Add(mDataRelation)
' jj 是Table2填入Table1的起始欄位
For Each mRow As DataRow In Table1.Rows
For ii = jj To Table2.Columns.Count - 1
mRow(jj+ii) = mRow.GetParentRow("TempJoin")(ii)
Next
Next

2. 排序(Sort)
Table1.DefaultView.Sort(Field1)
For i = 0 To Table1.DefaultView.Count - 1
aa=Table1.DefaultView(i).Item("Field2")
next

3. 篩選(Filter)
Dim rows As DataRow() = dtTopicid.Select("Field1='aaa'")

4. 衍生欄位(Derived Field)
Dim col As DataColumn
col = dt.Columns.Add("ExpCol", GetType(Boolean), expr)



另外,還有一些小技巧,與大家分享:
1. 欄位值大小寫有區別(Case Sensitive)
Table1.CaseSensitive = True

2. 設定額外屬性(Custom Property)
column.ExtendedProperties.Add("TimeStamp", DateTime.Now)

3. 取唯一值(Unique Values)
Dim dtDistinct As DataTable = Table1.DefaultView.ToTable("Table1", True, "Field1")

2011年4月13日 星期三

以內碼設定字串值

Q:如何列印所有的中文字或全行字?

A:
For i As Integer = 0 To 20901
sb.Append(ChrW(&H4E00 + i))
Next
** Console mode 無法顯示部份字元,例如ㄎ,應該是DOS Mode的中文字集不足的問題。

2011年1月25日 星期二

VS 安裝專案的注意事項

產生安裝專案時有兩件事,設定常常找不到:

  1. 要在桌面產生一個捷徑
  2. 要使用.net framework 2.0

在桌面產生一個捷徑

不能在【使用者的桌面】按滑鼠右鍵增加一捷徑,這樣會使捷徑指到執行檔所在目錄,而非執行檔本身;必須在【應用程式資料夾】的【主要輸出】按滑鼠右鍵增加一捷徑,再將該捷徑拖曳到【使用者的桌面】。

要使用.net framework 2.0

除了執行檔專案建置要設成.net framework 2.0外,在安裝專案的Mocrosoft .net Framework項目,須Double Click後,設定.net framework 2.0,如下圖。

1

2

2010年11月4日 星期四

在同一個目錄建立兩個 .net 專案


問題
通常寫一個Library後,為了測試並說明使用方法,通常會希望再開一個專案,如果將這個專案建在其他目錄,管理上並不方便,另外,有時候我們希望兩個專案共用一些表單,須要複製一份,對Source Code Control也不是很方便,所以基於上訴原因,我會希望在同一個目錄建立兩個專案。

解決方案
通常新增一個專案後,VS會在指定目錄下建立一個與專案名稱同名的子目錄,透過這種方式,我們就無法在同一個目錄建立兩個專案,必須採取另一個變通的方式,在英文版的VS2010可以點選 File>New>Project from existing code ,選擇目錄及指定專案名稱後,就可以在既有的目錄新增一個專案,之後再把第一個專案加入到方案即可。
但是中文版VS2008卻看不到這個選單,經過一番搜尋,原來是被隱藏了。解決方法就是點選 工具>自訂,在 【命令】頁籤下找到【檔案】類別中的【現有程式碼中的專案】,將它拖曳到選單中,就搞定了。

Keep Coding !!

2010年7月10日 星期六

UniCode Information

Q: 如何輸入UniCode內碼,以輸出字串?
A: Console.WriteLine(ChrW(&H4EBA))

Q: 如何查詢中文字的UniCode內碼?
A: 在這個網站輸入中文即可

2010年3月24日 星期三

Move Column position in Data Table

Q: How to Insert Data Column in a specified position, instead of appending to last column?
A: DataTable.Columns.Add does not support it. We need to adjust the position after adding the column. The sample code is listed as below:

 
  Dim mColumn As New DataColumn("Column1")
  Table1.Columns.Add(mColumn)
  mColumn.SetOrdinal(0)

2010年1月21日 星期四

先裝.net 再安裝IIS的處理方式

在%WindowsDir%\Microsoft.NET\Framework\vx.y.zzzz\ 目錄下執行
aspnet_regiis.exe -i

2009年9月16日 星期三

在Form_load事件中關閉表單

Q: 在Form_load事件中關閉表單,會造成程式錯誤,該如何解決?

A: 利用 Timer,在 Timer.Tick 事件中關閉表單,程式如下:

' close form since it cannot call me.close in form_load
Private WithEvents Timer1 As New Timer
Private Sub Timer1_Timer() Handles Timer1.Tick
Me.Close()
End Sub

Private Sub Form_Load(ByVal sender, ByVal e As System.EventArgs) Handles Me.Load
MsgBox(objTEJErrorMessage.GetLocalString("EA009_NoAccessRight").ToString)
Timer1.Interval = 100
Timer1.Enabled = True
End Sub

2009年5月26日 星期二

Msg 3623, Level 16 error in SQL Server

今天執行一個 SQL 指令, 產生下列錯誤訊息:
Msg 3623, Level 16, State 1, Procedure sp0_anprcd_growth, Line 123發生網域錯誤。

查了老半天, 原來是數學運算有錯, 天啊. 這是哪一國的錯誤提示?

指令如下:
select a.證券代碼 , a.證券代碼 + ' ' + max(c.證券中文簡稱) as 證券 , POWER(CAST(10 AS FLOAT),SUM(LOG10(1+[報酬率%]))) as [股價漲跌%] , sum(case 日期 when a.EndDate then b.[收盤價(元)] end) as [迄日收盤價(元)] from #anprcd_1 a, view_anprcd b , view_astkind c where a.證券代碼=b.證券代碼 and a.證券代碼=c.證券代碼 and b.日期 >= a.StartDate and b.日期 <= a.EndDate group by a.證券代碼 order by [股價漲跌%] desc

應修正為
POWER(CAST(10 AS FLOAT),SUM(LOG10(1+[報酬率%]/100)))

感謝恩公如下:
http://www.sql-server-performance.com/faq/domain_error_occurred_p1.aspx

2008年12月31日 星期三

如何在.net程式中加密, Java程式中解密(Encode in .net and decode in java)

Q: 如何在.net程式中加密, Java程式中解密?

A:
.net:
Imports System.Web
...
Me.TextBox2.Text = HttpUtility.UrlEncode(Me.TextBox1.Text)


Java:
import java.net.*;
public class EncodeDecode{
public static void main(String[] args) {
System.out.println= URLDecoder.decode(args[0], "UTF-8");
}
}

2008年11月20日 星期四

以 VS 2008 製作 .net framework 2.0 的安裝專案

Q: IDE 採 VS 2008, 但專案以 .net framework 2.0 開發, 但執行安裝檔時卻需安裝 .net framework 3.5, 應如何處理 ?


A: 可依下列步驟解決:
  1. 在方案總管中的安裝專案按滑鼠右鍵, 選取【屬性】, 畫面如下:


  2. 按【必要條件】, 改勾選【.net framework 2.0】

  3. 在【偵測的相依性】下點選【Microsoft .NET Framework】,修改Version屬性為2.0.50727












Keep coding.

2008年9月29日 星期一

全球化(Globalization)與本地化(Localization)作法

Q: .net 程式如何實作多語系功能?

A: 多語系一般分為全球化(Globalization)與本地化(Localization)兩部份.

  1. 全球化(Globalization):將系統介面改成多國語言, 使用者可依喜好選擇他所要的語言.
  2. 本地化(Localization):針對貨幣、日期、數字等格式,依當地的文化顯示適當的格式.

在VS2005中可直接針對畫面設定Localizable屬性=True,並且切換Language屬性,之後即可依所定語言修改畫面,系統會自動產生資源檔;其他訊息也可每一語言自訂一資源檔儲存。

接著在程式中設定語系即可切換不同語系的系統介面,程式如下:

' 設定系統介面,即全球化(Globalization)

Thread.CurrentThread.CurrentUICulture = new CultureInfo(“zh-tw”)

' 設定貨幣、日期、數字等格式,即本地化(Localization)

Thread.CurrentThread.CurrentCulture = new CultureInfo(“zh-tw”)

That's all.

2008年8月20日 星期三

如何使用AJAX Javascript library?

Q: 如何使用AJAX Javascript library, 改變Radio Button的選項 ?

A: AJAX Javascript library 包含一個 $get 函數, 可輕易取得HTML控制項及asp.net server控制項,例如,表單上有一TextBox1控制項,只要在Javascript中使用

$get('TextBox1').value='test';

就可以在client端改變TextBox1控制項的內容了。


我作了一個簡單的例子,改變Radio Button的選項,程式如下:

只要使用$get('RadioButton1').checked = true; 就可以改變Radio Button的選項,很簡單吧!
但是進一步的問題來了, 如果使用Master Page該怎麼辦? 我的解法是在asp.net server端網頁產生上述的function, 秘訣是以 me.RadioButton1.ClientID 取得控制項名稱,加到 $get() 中。
mScript &= vbNewLine & "function setRadioButton(){ "
mScript &= "$get('" & Me.RadioButton1.ClientID & "').checked = true;"
mScript &= "}"
ClientScript.RegisterClientScriptBlock(GetType(XXX), "RadioButtonFunc", mScript)
其中XXX是類別名稱(class name)。

2008年7月23日 星期三

如何在執行階段指定SQLDataSource的參數值?

Q: SQLDataSource的SQL指令可以指定參數, 並繫結控制項、session、cookie或Query String值, 不幸的是要指定的變數值非以上任何一種, 應如何在執行階段指定參數值?

A: 很簡單, 只要在SqlDataSource1_Selecting 或其他 -ing的事件中指定即可, 例如下例, 指定參數userid值為login的用戶代號:
e.Command.Parameters("@userid").Value = User.Identity.Name

** 切不可使用
SqlDataSource1.SelectCommand &= " where userid = '" & User.Identity.Name & "'"