トップ回答者
VBコードをC#コードにコンバートしたい

質問
-
以前に大変お世話になりましたze73ともうします。
ACCESSからSQL Serverに乗り換えたのを機会にデータベースの勉強をやり直そうとして、「ひと目でわかるVisual Basic 2008 データベース開発入門」を読み始めたところです。
本当はC#での解説本を探したのですがないものですから、無謀にもVB→C#に書き換えて読もうとしています。
Private Sub rdbMale_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdbMale.CheckedChanged '男性のラジオボタンが選択されていない場合には以降の処理を中止する If rdbMale.Checked() = False Then Return 'バインディングソースから現在のデータを取得する Dim drv As DataRowView = Me.Tbl_staffBindingSource.Current 'Null値または男性以外の場合には男性の値(1)をセットする If IsDBNull(drv("staff_sex")) OrElse drv("staff_sex") <> 1 Then drv("staff_sex") = 1 End If End Sub
上のVBコードをC#で書き換えてみたのですが、
private void rdbMale_CheckedChanged(object sender, EventArgs e) { //男性のラジオボタンが選択されていない場合には以降の処理を中止する if (!rdbMale.Checked) return; //バインディングソースから現在のデータを取得する DataRowView drv = (DataRowView)this.tbl_staffBindingSource.Current; //Null値または男性以外の場合には男性の値(1)をセットする if (drv["staff_sex"] == System.DBNull.Value || drv["staff_sex"] != "1") { drv["staff_sex"] = 1; } }
drv["staff_sex"] != "1" のところで、
「予期しない参照比較です。比較値を取得するには型'string'に左辺をキャストしてください」
とのエラーになってしまいます。
(string)などを試してみましたがだめでした。どのように書くのが正しいのでしょうか、お教え願います。
(併せて)Freeで、比較的に高性能のコンバーターをご紹介いただけませんでしょうか。
zen73
回答
-
CheckedChangedイベントはフォームが表示される際にも発生しているはずです。つまり、フォームが表示される際に何度かCheckedChangedイベントハンドラが実行されていることになります。ブレークポイントを設定した際に何度かCheckedChangedイベントハンドラが実行されていませんでしたでしょうか? もしそうであれば、最初はdrv["staff_sex"] がまだnullなのかもしれません。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク zen73 2009年7月8日 3:16
すべての返信
-
ToString はキャストじゃありません。そのオブジェクトの文字列表現を取得するメソッドです。
で、staff_sex 列には int 型のデータを格納してるみたいですから、int にキャストしてやればいいんじゃないでしょうか。
(int)drv["staff_sex"]
"1" と 1 は、文字列= String 型 (string) と数値= Int32 型 (int) で全く別のものです。ちゃんと区別しましょう。 -
(併せて)Freeで、比較的に高性能のコンバーターをご紹介いただけませんでしょうか。
ソース レベルのコンバーターではないですが、「.NET Reflector」というものがあります。
.NET Reflector, class browser, analyzer and decompiler for .NET
http://www.red-gate.com/products/reflector/
VB ソースを一旦コンパイルして、出来上がったアセンブリを元に C# ソースを生成することができます。
VB と C# を比較して学習するのが目的と思われますので、VB ソースがどのように C# ソースで表現されるかの参考になると思います。 -
(併せて)Freeで、比較的に高性能のコンバーターをご紹介いただけませんでしょうか。
私が知ってるのは以下ぐらいです・・・
Code Translation for .NET (C#<->VB.NET)
http://www.carlosag.net/Tools/CodeTranslator/Convert VB.NET to C#
http://www.developerfusion.com/tools/convert/vb-to-csharp/Convert VB.NET to C#
http://www.dotnetspider.com/convert/Vb-To-Csharp.aspx
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/ -
staff_sex 列には int 型のデータを格納しています。
Hongliangさんに教えていただいた
(int)drv["staff_sex"]
でデバッグしてみましたら、
「指定されたキャストは有効ではありません」
とのエラーがでてしまいました。それで何気なしに、
int.Parse(drv["staff_sex"].ToString())
としてみましたら、エラーが出ませんでした。
しかし、2つの疑問があります。
1)rdbmaleとrdbfemaleの2つのラジオボタンがあるのですが、
上記のデバック時エラーはrdbmaleでのこと。rdbFemaleのCheckedChangedイベントもまったく同じコードなのに
(int)drv["staff_sex"] がエラーにならないのはなぜでしょうか。
2)object型→文字型→整数型としているのですが、object型→整数型とする方法はないのでしょうか。
*ここでも・・・
switch(int.Parse (drv["staff_sex"].ToString ()))
{
case 1:case 2:
}
zen73 -
CheckedChangedイベントはフォームが表示される際にも発生しているはずです。つまり、フォームが表示される際に何度かCheckedChangedイベントハンドラが実行されていることになります。ブレークポイントを設定した際に何度かCheckedChangedイベントハンドラが実行されていませんでしたでしょうか? もしそうであれば、最初はdrv["staff_sex"] がまだnullなのかもしれません。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク zen73 2009年7月8日 3:16
-
CheckedChangedイベントはフォームが表示される際にも発生しているはずです。つまり、フォームが表示される際に何度かCheckedChangedイベントハンドラが実行されていることになります。ブレークポイントを設定した際に何度かCheckedChangedイベントハンドラが実行されていませんでしたでしょうか? もしそうであれば、最初はdrv["staff_sex"] がまだnullなのかもしれません。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
trapemiyaさん、ありがとうございます。
「最初はdrv["staff_sex"] がまだnullなのかもしれません。」
ご指摘のとおりです。これで疑問が解消されました。
65歳になりましたが、以前に教えていただいて完成させた「会計簿」の機能充実を図ろうとして、データベースの勉強をやりなおしているところです。これからもよろしくご教示のほど、よろしくおねがいします。
zen73