0

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

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

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

以下是我如何解决这个问题。我的代码有效,但对我来说似乎很笨拙。IE。嵌套的 try/catch 和嵌套的循环/条件语句。

有没有更简单/更好/更清洁的方法来实现这一点?

ERPDB.sqlGetDataReaderreturn 接受一个 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 回答