-1

datagridview から値を取得するために C# で拡張メソッドを作成しています。ここで、ユーザーが存在しない列名を指定した場合、この関数は、この関数が呼び出される場所で処理できる例外をスローします。どうすればこれを達成できますか。

   public static T Value<T>(this DataGridView dgv, int RowNo, string ColName)
    {
            if (!dgv.Columns.Contains(ColName))
                throw new ArgumentException("Column Name " + ColName + " doesnot exists in DataGridView.");
            return (T)Convert.ChangeType(dgv.Rows[RowNo].Cells[ColName].Value, typeof(T));
    }
4

3 に答える 3

2

これは正しい方法ではありません。まず、ユーザーが何かをタイプミスすることは例外ではありません。第 2 に、この拡張メソッドは、データベースなどで動作するある種のコードで深くネストされて呼び出される可能性があります。入力ミスは正常であるため、例外をキャッチする必要があります。ただし、例外ハンドラーと、プログラムの状態を適切に復元する一連のコードを作成するという負担もあります。

ユーザー入力の検証は、停止するのが難しい一連のコードを開始する前に、早い段階で行う必要があります。また、ユーザー入力の検証で例外を使用する理由はありません。単純な if() ステートメントで作業が完了します。

必要に応じて、throw ステートメントをそのままにしておくことができます。これにより、診断が改善されます。ただし、コードのバグを診断するようになったため、その例外を処理しないでください。また、catch 句でバグを修正することはできません。

于 2010-04-24T09:39:00.960 に答える
1

あなたの質問を理解するのは難しいですが、拡張メソッドを呼び出す場所で例外をスローして処理したいようです。もしそうなら、あなたはほとんどそこにいます。すでに例外をスローしていますtry/catch。コールサイトの周りにブロックを配置するだけです。

public static T Value<T>(this DataGridView dgv, int RowNo, string ColName)
{
    if (!dgv.Columns.Contains(ColName))
        throw new ArgumentException("Column Name " + ColName + " doesnot exists in DataGridView.");
    return (T)Convert.ChangeType(dgv.Rows[RowNo].Cells[ColName].Value, typeof(T));
}

// Wherever you call the method:
try
{
    dataGridView.Value(rowNumber, columnName);
}
catch (ArgumentException)
{
    // caught the exception
}

これはあなたが探しているものですか?

于 2010-04-24T06:45:05.400 に答える
0

質問はすでに回答されていますが、2番目の解決策を提案します。例外をスローするという考えは、最後の選択肢であるべきです。以下のアプローチを使用して同じことを達成できます。

public static bool TryGetValue<T>(this DataGridView dgv, int RowNo, 
    string ColName, out T cellValue)
{
    cellValue = default(T);
    if (!dgv.Columns.Contains(ColName))
        return false;
    cellValue = (T)Convert.ChangeType(dgv.Rows[RowNo].Cells[ColName].Value, typeof(T));
    return true;
}

public static void Main(){
int desiredValue;
if(dataGridView.TryGetValue<int>(rowNumber, columnName, out desiredValue)){
    //Use the value
}
else{
    //Value can not be retrieved.
}
}

PS: このコードはエディターで入力していないため、タイプミスはご容赦ください。

于 2010-04-24T11:48:27.463 に答える