星期五, 10月 20, 2006

微軟技術論壇回答的文章整理


  • 問題:我的要求是:年份是闰年的判断
熊的回答:
闰年的判断
DateTime.IsLeapYear
  • 問題: 跪求:C#中CPU密集运算时如何获取控制权?
熊的回答:使用Application.DoEvents(); 即可!
  • 問題:Structure回收問題
查過資料後structure不是由記憶體回收行程管理,那如何回收?
不回收會不會造成記憶體不足?
自己要寫dispose?
是不是少用structure?
謝謝回答

熊的回答:
Structure算是value type的一種,所以不會有記憶體回收的問題!宣告一個value type他所佔用的空間是固定的,也就是不會因為你的資料量的增加而
佔用空間變多,也不會因為改變了儲存的值改變了容器的大小,而value type佔用的空間是在stack裡。


而記憶體回收主要是針對reference type,為什麼呢?因為他會有二段資料,指向器(存在stack中),而另一段是資料(存在heap中),例如你操作一個字串相加 例如 s + =
"123";
其實他做了如下的動作,將你原來s的資料搬出來後,與123做相加,然後放回了新的一堆記憶體中(heap),然後把你的指向器指向了新的記憶體中間。此
時問題來了,原始記憶體空間並沒有指向器指到那個空間,所以記憶體回收主要是做這一塊。


而stack中的資料是何時被回收呢? 其實當你一個行程結速時,他就會空出空間了,例如你在一個function中定義了個value type,當結束此function時,他就放出了資源。

  • 問題:讀取字串有幾個相同的字
假設我今天有一個字串是"A,B,C,E,F,G,"
我要如何得知 我的字串裡面有幾個 ","
不知道是否有現成的函式可用呢?
還是該如何去解決呢? 希望可以給個指示的方向阿!! 謝謝

熊的回答
善用regex即可~
Imports
System.Text.RegularExpressions

Dim text1 As String = "A,B,C,E,F,G,"
Dim regex1 As New Regex("[,]")
MessageBox.Show(regex1.Matches(text1).Count.ToString)
  • 問題:如果取得目前營幕解析度?
熊的回答:
MSDN中
即有例子,run一下應可以知道!

Bound 指的是營幕設定的解析度~
Private
Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BtnGetScreenInfo.Click

Dim Index As Integer

Dim UpperBound As Integer

' Gets an array of all the screens connected to the system.

Dim Screens() As System.Windows.Forms.Screen = _

System.Windows.Forms.Screen.AllScreens

UpperBound = Screens.GetUpperBound(0)

For Index = 0 To UpperBound

' For each screen, add the screen properties to a list box.

ListBox1.Items.Add("Device Name: " + Screens(Index).DeviceName)

ListBox1.Items.Add("Bounds: " + Screens(Index).Bounds.ToString())

ListBox1.Items.Add("Type: " + Screens(Index).GetType().ToString())

ListBox1.Items.Add("Working Area: " +Screens(Index).WorkingArea.ToString())

ListBox1.Items.Add("Primary Screen: " +Screens(Index).Primary.ToString())

Next

End
Sub

  • 問題:程式片段
小弟觀摩他人的程式以下片段一直不得搞不懂 不知是否可以指點一二尤
其Function GetDataSplit 是啥作用呢

If tmp.GetLength(0) > index Then Return tmp(index)又有何目的
略...
熊的回答:
1.Dim tmp As String() = data.Split(Sep),這段是在將字串用step拆解
2.If tmp.GetLength(0) > index Then Return tmp(index)
,判
段你要取回的index是否合理

例如你下 GetDataSplit("abc", "0") 會得到因為在1步時tmp(0) 為a
1為b 2為c
第2步判別陣列大小3比你要取的index值來得大(表示合理值,取用不會出錯), 回傳a
  • 問題:win form內崁 WebBrowser的問題?
請問各位大大
我在win form裡面內崁 WebBrowserControl(與Form同大小),
但我把win form的FormBorderStyle設為None
因此無法移動視窗
雖然有些書說明只要在MouseMove和MouseDown上撰寫相關程式即可解決
但是由於我內嵌WebBrowserControl所以沒有MouseMove和MouseDown事件
請問該如何解決呢?
感謝^^

熊的回答

使用 HtmlElementEventHandler!

private void Document_MouseDown(object sender, HtmlElementEventArgs e)
{

}

private void Document_MouseMove(object sender, HtmlElementEventArgs e)

{
}
private void Document_MouseUp(object sender, HtmlElementEventArgs e)

{
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Document.MouseDown += new
HtmlElementEventHandler(Document_MouseDown);

webBrowser1.Document.MouseMove += new
HtmlElementEventHandler(Document_MouseMove);

webBrowser1.Document.MouseUp += new
HtmlElementEventHandler(Document_MouseUp);
}

  • 問題: 請教一下Calendar用法

你好,我是一個剛接觸visual studio的初學者.現在我剛好遇到一個問題,就是Calendar的用法不太清楚.
問題如下:
我要設計的是它不可以點選當天以前的時間.如今天是2006年8月11日,那我想設定的是只可以點選8月11日當天或以後的時間.
希望各位前輩可以指導一下用法.
我是不想讓使用者切換到別的月份,只有是過去的月份都不能點.

熊的回答:
Sorry沒注意到你是asp.net版,下面的範例為 只能選取8/1日後的日期.之前也會顯示.但無法選取應符合您的需求~

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
DateTime dt = new DateTime(2006, 08, 1);
if (e.Day.Date >= dt)
{
e.Day.IsSelectable = true;
}
else
{
e.Day.IsSelectable = false;
}
}

  • 問題:關於tabcontrol上的標籤問題

請問一下tabcontrol上的tab能夠在選到他的時候更改它的字型顏色或者是在字的下方加底線,因為想要讓user能更明顯的知道使用的是哪一個tab

熊的回答
1.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed
2.掛上事件自己畫,想怎麼晝就怎麼畫
private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
TabControl tctmp = (TabControl)sender;

Graphics g = e.Graphics;
Pen p = new Pen(Color.Blue);
Font font;
SolidBrush brush;

if (tctmp.SelectedIndex == e.Index)
{
brush = new SolidBrush(Color.Red);
font = new Font("Arial", 8.0f, FontStyle.Underline);
}
else
{
brush = new SolidBrush(Color.Black);
font = new Font("Arial", 8.0f);
}
g.DrawRectangle(p, tctmp.GetTabRect(e.Index));
g.DrawString(tctmp.TabPages[e.Index].Text, font, brush,
(RectangleF)tctmp.GetTabRect(e.Index));
}

  • 問題:CreateSpecificCulture()與New CultureInfo()的差異
請教各位大大:(.Net Framework 2.0)
CultureInfo.CreateSpecificCulture("??-??")與
CurrentCulture = New CultureInfo("??-??")有何差別呢?
例如使用CultureInfo.CreateSpecificCulture("ja")便沒有 exception發生,
但CurrentCulture = New CultureInfo("ja")就發生exception!

熊的回答
基本上二者是相同的..就算是靜態函式CreateSpecificCulture內部也是叫用CultureInfo的建構子~
不同的事情在,當CreateSpecificCulture在呼叫CultureInfo建構子時,若有發生錯訊他會幫你做必要的處理當他發現你的參數是無法建立起來時,他會幫你check是否有此參數開頭相同的名稱若有就幫你建立,所以他也不是無止盡的不出錯,例如你可以試試看

CultureInfo ci = CultureInfo.CreateSpecificCulture("JA-"); //ok不出錯
CultureInfo ci = CultureInfo.CreateSpecificCulture("JA-aaa"); //ok不出錯
CultureInfo ci = CultureInfo.CreateSpecificCulture("J-aaa"); //出錯
所以CreateSpecificCulture只是會幫你額外做檢查而以
對於文化資訊,你可以參考文化資訊的格式說明,與自訂文化資訊,應會有更深的認識~

  • 問題:將記事本檔案的編碼從ANSI 轉成 Unicode
我現在有 100個 純文字檔 每個檔案 約有 10000筆資料
我知道 我的文字檔的編碼方式都是使用 ANSI 但是現在我想要改成Unicode
不知道有沒有什麼比較好的方式 可以轉換呢?
呵呵 總不可能把文字檔打開 另存新檔 選擇 Unicode 的編碼方式
我是使用Visual Basic 2005 來開發的
作業系統 Windows Server 2003
謝謝

熊的回答:
您好給你二段程式參考
我vb比較不熟,您再自己組合一下
Imports System.IO
Imports System.Text
1.
取得特定目錄下所有副檔名為txt的方式

Dim info1 As New DirectoryInfo("c:\")

Dim info2 As FileInfo

For Each info2 In info1.GetFiles("*.TXT")

MessageBox.Show(info2.Extension)

Next
2.將字碼做轉換.由ansi轉為unicode!
Dim reader1 As New StreamReader("C:\TEST-ANSI.txt", Encoding.Default)

Dim writer1 As New StreamWriter("c:\TEST.TXT", True, Encoding.Unicode)
writer1.Write(reader1.ReadToEnd)

writer1.Flush()

writer1.Close()

reader1.Close()

  • 問題:Crystal Report無法處理直式字型?
請問一下,我使用vs2005內的Crystal Report製作報表,因為要列印標籤的關係所以將欄位字型選成直式字型(@細明體),但在CrystalReport viewer中及列印結果均無法顯示成直式字型,奇怪的是如果把它匯出成PDF,就可以正常顯示出直式字型,之前使用vs2003的crystal report不會有此問題,請問這應該如何解決?謝謝.

熊的回答:
我發覺幾件事情
1.在properties windows中點選的字型會選不到@的字型
2.在properties windows無法改變font.gdiverticlfont 與gdicharset!
但若你對text object按右鍵選format object則字型可以選到"@xxx"
而若使用format object的方式去設定.我打印的結果是正常的(使用@細明體)。
  • 問題:如何得知一個控制項目中是否有某一個屬性值
要如何得知一個控制項目中是
否有某一個屬性值,的指令?

因為我想判斷,如何這個控制項有這個屬性的話會去執行某斷指令?
熊的回答
使用PropertyInfo!
imports System.Reflection
Dim info1 As PropertyInfo = xxxx.GetType.GetProperty("Hint")
If (Not info1 Is Nothing) Then
表示有

  • 問題:如何自動編號??
各位高手:我是使用SQL
2000 ,我有二個資料表,我使用SELECT
方式,JOIN出我要的資料,但是如我想要在這些資料中增加一個欄位做自動流水編號,應該要如何下指令?

熊的回答
使用rowid,若你是sql2005那可以使用row_number()!
IF EXISTS
(SELECT * FROM TEMPTABLE)

DROP
Table TEMPTABLE

GO

select
ROWID=IDENTITY(int,1,1), *

INTO
TEMPTABLE

from
YourTable

go

select * from TEMPTABLE;
go
  • 問題:請教如何攔截BindingSource.MoveNext VB2005
BindingNavigator1.BindingSource= BindSource1
當我們按下BindingNavigator1的MoveNextItem
它會自動呼叫BindSource1的MoveNext
並且會針對目前這筆資料作EndEdit動作
我希望能在EndEdit之前先做資料判斷
如果資料錯誤則不要做EndEdit以及MoveNext的動作
請問應該要怎麼做
謝謝

熊的回答:
原生的bindingsource無法做到!
你可以試著使用 datatable.RowChanging
AddHandler Me.dataSet1.TABLENAME.RowChanging, New
DataRowChangeEventHandler(AddressOf Me.TABLENAME_RowChanging)


Private Sub TABLENAME_RowChanging(ByVal sender As Object, ByVal e As
DataRowChangeEventArgs)

do something!

End
Sub

  • 問題:關於SQL時間函數
各位前輩大大
請問在sql server中有 類似 my sql 中的UNIX_TIMESTAMP(date)及FROM_UNIXTIME(unix_timestamp) 的函數用法嗎??
或者 要如何達到這個功能? 煩請各位前輩不吝指導~

熊的回答
你是要計算二個日期間距離的天數、時、分等資料吧? 試試看 datediff吧!
DATEDIFF( datepart , startdate , enddate )
selectDATEDIFF(minute, Convert(DateTime, '2006/01/01'), Convert(DateTime,
'2006/01/02'))

  • 問題:功能表的快速鍵?
請教各位大大一個笨問題
我看書上寫說如果要設定功能表上的快速鍵
只要設定ShortcutKeys的值就好
可是我怎麼設了之後都沒反應呢?
麻煩幫我解惑一下~~感謝^^

熊的回答
若你是要設定最外層的hotkey.你可以試試如下的方式~
ToolStripMenuItem.Text= "熊(&A)"; 在&後的第一個英文字母即MENU的HOTKEY! 按ALT+A即是!
若你是要設定ShortcutKeys,那要設在第一層之下(你可以看看現在IE與OFFICE的操作方式),而按壓的功能即會馬上被觸發才是!
  • 問題:讓程式不會繼續往下執行
熊的回答
使用void的型式,其實都是省略return,所以直拉在你想離開整個處理函式時,下return;(無回傳值)即可!
  • 問題:IErrorInfo.GetDescription 因為 E_FAIL(0x80004005) 而失敗
不好意思我想請問一下
我的ACCESS是2003 但是我現在有個資料庫檔是97的版本
那我用2003可以將資料庫打開但是我用vs.c#2003
去連資料表的時候會發生下面的錯誤
IErrorInfo.GetDescription因為 E_FAIL(0x80004005) 而失敗。
我想請問一下這事什麼原因
謝謝
熊的回答
http://www.dbforums.com/showthread.php?p=4550116
當你的資料表有sql的保留字時,就會發生此問題~不管是tabname或是fieldname~


藍色小舖回答文章整理

最近好忙好累.只好整理了一下最近在藍色小舖論壇上回答的一些問題(2006/07-2006/10) ,要不然會長草



  • 問題:如何寫用遞迴求最大公因數
    熊的回答:
    求最大公因數(沒記錯是正數才能算.若有不對.請糾正)
    public int GreatestCommonDivisor(int a, int b)
    {
    if (a <= 0 b <= 0) //原程式手誤.寫成and
    throw new ArgumentException("參數不可為零");
    return (a % b == 0 ? b : GreatestCommonDivisor(b, a % b));
    }
    若對於"?"這種運算元有問題.可以參考我blog的說明
    http://huwk.blogspot.com/2006/09/int_14.html
  • 問題:動態傳入參數
    我想將 process 函式改寫成可以接收更多的 x 參數,
    例如: process(10);
    or process(10, 11, 12, 13);
    而不要額外增加多一個 process 函式,
    請問應如何修改語法?
    熊的回答:
    public static void UseVariableParameters(params int[] list)
    {
    for ( int i = 0 ; i < list.Length ; i++ )
    {
    MessageBox.Show(list[i]);
    }
    }
    public static void DemonstrateVariableParameters()
    {
    UseVariableParameters(1,2,3,4,5);
    }
  • 問題:資料表資料太多時的搜尋問題
    想請教各位一下 如果我的網站裡的資料表中的資料數目過多時
    對資料表的某筆資料搜尋 會造成速度減慢嗎? 如果會?那能否有方法改善
    因為最近學資料結構 了解循序搜尋跟二元搜尋
    但不曉得MS SQL在搜尋的情況是什麼樣子的?
    我是用ASP.NET來寫網站~如果預設的搜尋方式是循序的
    那能否改成二元的方式呢?
    有方法嗎?請問高手們,如果我說錯哪裡,請不要留面子
    謝謝各位
    熊的回答:
    參考看看吧
    http://yes.nctu.edu.tw/SQL/Articles/SQL和資料庫簡介(全文版)%20.pdf#search=%22SQL%20%E8%AA%9E%E6%B3%95%20%E6%95%88%E7%8E%87%22
    基本上,你的"資料庫"應是經過設計的.例如經過正規化!
    然後建立必要的pk與index..而若你使用查詢時,供可能使用這些有pk index的欄位
    例如你有一個table有三個欄位
    代碼 <--可以設定成pk
    姓名
    生日
    則你查詢時供量讓代碼出現在你的where條件中的第一個 例如 where 代碼 >= 10
    若你查要用生日當查詢.那你可以在生日加一個index!
    建議你還是先瞭解一下資料庫的運作方式!

  • 問題:變更資料庫的Instance Name
    請問sql 2000 和 sql 2005,於安裝完成後,若想變更Instance Name分別要如何變更?
    熊的回答:
    http://support.microsoft.com/kb/260414/en-us?ln=en-us&sd=gn&fr=0
    5. Q: Can I rename an instance of SQL Server 2000 after I have already installed it on the computer?
    A: Yes. You can change the name of an instance as long as the server is not clustered. For more information, visit the following Microsoft Developer Network (MSDN) Web site:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/instsql/in_afterinstall_5r8f.asp

  • 問題:日期相減算到小時??
    熊的回答:
    使用timespan即可!
    http://huwk.blogspot.com/2006/09/timespan.html

  • 問題.請問out和ref的不同?
    從MSDN的說明看起來...
    out和ref似乎只是"用法"上有點不同?
    實際上都是以傳址 (By Reference) 方式傳遞引數...
    除此之外還有什麼不同嗎?
    如果說要把C#的程式改成VB.NET...
    遇到out改成ByRef就解決了嗎?
    請高手指導~感謝~
    熊的回答:
    我額外補充說明囉!!..請看程式註解..
    C# CODE
    private void button1_Click(object sender, EventArgs e)
    {
    int iout;
    int iref;
    //使用out時,傳入值不重要!
    Test1(out iout);
    //使用ref時,需先初始化值!
    iref = 10;
    Test2(ref iref);
    }
    public void Test1(out int i)
    {
    //不管傳入值是什麼,一率都不會使用,所以必需明確先初始化
    i = 10;
    i = i + 1;
    }
    public void Test2(ref int i)
    {
    //可以直接使用
    i = i + 1;
    }
    VB.NET CODE
    Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim num1 As Integer
    Me.Test1(num1)
    Dim num2 As Integer = 10
    Me.Test2(num2)
    End Sub
    Public Sub Test1(<Out> ByRef i As Integer)
    i = 10
    i = (i + 1)
    End Sub
    Public Sub Test2(ByRef i As Integer)
    i = (i + 1)
    End Sub

  • 問題:讀檔再判斷的問題?
    有一毎列長度為50 bytes的txt檔,其中毎列的第4~8 bytes是學號,我想判斷該檔案中的學號有無重覆,如果有則傳回一固定值.可以請大家指點嗎?謝謝!
    熊的回答:
    private static void CheckHB(System.Collections.Hashtable hb, string s)
    {
    if (hb.ContainsKey(s))
    {
    //用true代表存在
    hb[s] = true;
    }
    else
    {
    //不存在
    hb.Add(s, false);
    }
    }
    private void button1_Click(object sender, EventArgs e)
    {
    System.Collections.Hashtable hb = new System.Collections.Hashtable();
    string s = "";
    //這一段改用迴圈改成你讀文字檔中的學號即可
    s = "1234";
    CheckHB(hb, s);
    s = "1234";
    CheckHB(hb, s);
    s = "0000";
    CheckHB(hb, s);
    if (hb.ContainsValue(true))
    MessageBox.Show("Y");
    else
    MessageBox.Show("N");
    }

星期五, 10月 13, 2006

免費的elearning教材-Collection 5134 : Developing Rich Experiences with Microsoft® .NET Framework 3.0 and Visual Studio® 2005

對於.NET 3.0有興趣的您~不要錯過了!
https://www.microsoftelearning.com/eLearning/offerDetail.aspx?offerPriceId=109340

總共包含了一大包一年份免費的線上學習

Clinic 5135 : Introduction to Developing with Windows® Presentation Foundation and Visual Studio® 2005
Clinic 5136 : Introduction to Developing with Windows® Workflow Foundation and Visual Studio® 2005
Clinic 5137 : Introduction to Developing with Windows® Communication Foundation and Visual Studio® 2005

星期二, 10月 03, 2006

Visual Studio Code Name "Orcas" - September Community Technology Preview (CTP)

微軟發佈了Orcas CTP 版,他是使用Virtual Pc的格式,所以可以省去自行安裝相關環境的困擾! 相對的hdd空間越來越小,怎麼也沒想到.120g的hdd己經用了80g了! 慘!

http://www.microsoft.com/downloads/details.aspx?FamilyID=82243606-d16d-445c-8949-9ee8c10cda2e&DisplayLang=en

Microsoft Connect

之前在申請Microsoft Robotics Studio時,發現這個網站的存在,但當時並沒有很在意他,直到Visual Studio 2005 Sp1(Beta)版的釋出,熊才又光顧了這個網站,因為越來越受不了記憶體不足的錯訊,之前的文章有提到ram被吃光光,安裝sp1後情況並沒有改善,若你跟我有同樣的痛苦,請一起來投個票吧.這應是我目前工作上遇到最大的痛,因為完全無法排除與避免。

而connect扮演什麼樣的角色呢? 其實他就是一個溝通的平台,你可以把你的經驗、意見、想法還是遇到的問題往這裡做回饋的動作,例如你覺得那裡可以做的更好或是產品使用上的bug,都可以來這問查詢看看,看看別人是否有相同的問題,每個被提出來的主題都可以自由的讓參與者投票表決重要性! 所以這是一個很開放的平台!只要看得到的項目你都可以申請參與,而可以參與的項目會隨著你的參與狀況而增加的!!

記得~有空去投個票!! 3q非熊麻吉啦~