从数据库填充多个用户控件

时间:2013-08-15 21:40:33

标签: c# oracle loops user-controls try-catch

我需要根据用户在其中一个控件中选择的内容,在组框中(从数据库)填充一些用户控件。

每个控件都要由数据库中的表中的列填充。这些值偶尔会为空,有时是字符串,有时是整数。查询将只返回一行数据。

组框包含许多不同类型的控件;但是,我只需要填充只读文本框。

以下是我如何解决这个问题。我的代码有效,但对我来说似乎很笨拙。 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();
        }

1 个答案:

答案 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++);