我需要根据用户在其中一个控件中选择的内容,在组框中(从数据库)填充一些用户控件。
每个控件都要由数据库中的表中的列填充。这些值偶尔会为空,有时是字符串,有时是整数。查询将只返回一行数据。
组框包含许多不同类型的控件;但是,我只需要填充只读文本框。
以下是我如何解决这个问题。我的代码有效,但对我来说似乎很笨拙。 IE浏览器。嵌套的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();
}
答案 0 :(得分: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++);