「.NET質問箱」では、「どぼん!のプログラミング掲示板」に書き込まれた.NETプログラミングに関する投稿を基に、さらに考察を加え、Q&A形式にまとめて紹介します。注意この記事の最新版は「DataGridの列の幅を文字列の幅に合わせて自動的に調節する」で公開しています。【質問】System.Windows.Forms.DataGridの列の幅を、その列にあるすべてのセルとヘッダの文字列の最大幅となるように自動調節したいのですが、どのようにすればよいのでしょうか?【回答】DataGridの列のすべてのセルの文字列(及びヘッダのHeaderText)の長さをGraphics.MeasureStringメソッドで調べ、一番長いものに列のWidthを設定するという方法になるでしょう。この方法を使った簡単なコードを以下に紹介します。ここでは、DataGridのDataSourceにDataTableが設定されているものとします。8;}この方法は次のページでも紹介されていますので、参考にしてください。DataGridしかしこの方法には欠点があります。それは、セル内に表示される文字列をToStringで取得している点です。実際に表示される文字列はToStringで取得できる文字列と同じになるとは限りません。残念ながら、実際に表示される文字列を取得するのはとても難しいです。DataGridTextBoxColumnが設定されている場合は、DataGridTextBoxColumnのGetTextメソッドで取得できますが、このメソッドがprivateのため、通常はアクセスできません。よって実際に表示される文字列を取得するには、「隠蔽されている非パブリックメンバを呼び出す」のようにリフレクションを使ってGetTextメソッドにアクセスするか、自分で列スタイルを作成するかなどの方法になりそうです。(自分でGetTextと同じことをするコードを書く方法もありますが、全く同じになる保障はありません。注意この記事の最新版は「TabControlのタブを選択できないようにする」で公開しています。【質問】TabControl内のTabPageのEnabledプロパティをFalseにしてもそのタブは選択できてしまいます。簡単なのは、TabControlのSelectedIndexChangedイベントで選択したくないタブが選択された時に、別のタブを選択するという方法です。次のようにすれば2番目のTabPageは選択できなくなります。}この方法では選択させたくないタブが一瞬表示されるかもしれません。これが嫌だという場合は、さらに面倒な方法を使わなければなりません。スレッド、または、次に示すニュースグループ「microsoft.public.dotnet.framework.windowsforms」への投稿を参考にしてください。注意この記事の最新版は「埋め込まれたWAVEのリソースファイルを再生する」で公開しています。【質問】アセンブリにリソースとして埋め込んだWAVファイルを再生したいのですが、どのような方法がありますか?【回答】まず、埋め込まれたWAVファイルを一時ファイルに保存し、再生するという方法があります。これは、例えば次のようになります。(この例では、作成した一時ファイルを削除していません。実際には適当なタイミングで削除すべきです。}}PlaySound(もしくはsndPlaySound)関数を使ってWAVを再生する場合は、一時ファイルを作成する必要はありません。次のようにメモリ内に読み込まれたデータをそのまま再生することができます。Edition)ではうまく行かないようです。sndPlaySound関数についてMSDNでは「この関数は、PlaySound関数のサブセットであり、Windowsの以前のバージョンとの互換性のために残されています。」と書かれており、PlaySound関数を使った方がよいでしょう。注意この記事の最新版は「モードレスウィンドウが閉じられた時に結果を取得する」で公開しています。【質問】モーダルダイアログとしてフォームを表示したときは、DialogResultプロパティで結果を取得することができますが、モードレスで表示したときはできません。モードレスウィンドウが閉じられた時に結果を取得するにはどのようにすればよいのでしょうか?【回答】ここでは、Form1からForm2をモードレスで表示し、Form1でForm2が閉じた時の結果を取得するようにします。Form1にForm2のClosedイベントハンドラを作成することによりForm2が閉じられたことを知り、この時Form2の結果を取得するようにします。次の例では、Button1をクリックすることにより、Form2を表示しています。Console.WriteLine(f.DialogResult);}Form2では、結果を設定してからフォームを閉じるようにします。Form2のButton1をクリックすることによりDialogResultをDialogResult.OKとして閉じるには、次のようにします。this.Close();}このような方法以外に掲示板では、Codingslaveさんが、別のスレッドを作成してForm.ShowDialogメソッドを呼び出すことにより、モードレスウィンドウのようにする方法を提案されています。