ユーザーがコントロールの 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();
}