0

ユーザーがコントロールの 1 つで選択した内容に基づいて、(データベースから) グループ ボックスにいくつかのユーザー コントロールを設定する必要があります。

各コントロールは、データベース内のテーブルの列によって設定されます。値は null の場合もあれば、文字列の場合もあれば、整数の場合もあります。クエリは、1 行のデータのみを返します。

グループ ボックスには、さまざまな種類のコントロールが含まれています。ただし、読み取り専用のテキスト ボックスにデータを入力するだけで済みます。

以下は、私がこれを解決するために行った方法です。私のコードは機能しますが、私には扱いにくいようです。すなわち。ネストされた try/catch およびネストされたループ/条件ステートメント。

これを達成するためのより簡単な/より良い/よりクリーンな方法はありますか?

ERPDB.sqlGetDataReader戻り値は、SQL ステートメント文字列を引数として取り、OracleDataReader.

sqlStringユーザー コントロールからユーザー入力を取得し、SQL クエリを複数の列を持つ文字列として返します。

 private void populateReadOnlyColumns()
    {
        OracleDataReader dr = ERPDB.sqlGetDataReader(sqlString(userSelection));
        while (dr.Read())
        {
            int i = 0;
            foreach (Control control in groupBox1.Controls)
            {
                if( control is TextBox)
                {
                    TextBox txtBox = (TextBox)control;
                    if (txtBox.ReadOnly == true)
                    {
                        safeString(dr, txtBox, i);
                        i++;
                    }
                }
            }
        }
    }

private void safeString(OracleDataReader dr, Control control, int index)
{
    try
    {
        try
        {
            control.Text = dr.GetString(index);
        }
        catch
        {
            control.Text = Convert.ToString(dr.GetInt32(index));                                        
        }
    }
    catch
    {
        control.Text = "";
    }
}



private string sqlString(string userSelection)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("SELECT description");
            sb.AppendLine("       ,job_title");    
            sb.AppendLine("       ,category");
            sb.AppendLine("       ,risk_code");
            sb.AppendLine("       ,exempt_flag");
            sb.AppendLine("       ,pay_grade");        
            sb.AppendLine("  FROM emp_jobs");   
            sb.AppendLine(" WHERE job_code = '" + userSelection.Trim() + "'");
            return sb.ToString();
        }
4

1 に答える 1

1

LINQを使用することで、よりシンプル/クリーンにすることができます。

int i = 0;
foreach (TextBox txtBox in (from Control control in groupBox1.Controls
                            where control is TextBox && ((TextBox)control).ReadOnly
                            select control))
    safeString(dr, txtBox, i++);
于 2013-08-15T23:24:10.887 に答える