以编程方式通过控件名称绑定ComboBox

时间:2013-06-23 22:13:45

标签: c# winforms

让我先说明我不会做很多winforms工作,所以原谅我的无知。来自ASP的绑定有点奇怪。

我正在尝试循环一系列组合框并使用控件名称字典和相应的存储过程绑定它们。这是我正在尝试做的简化示例。

    public Dictionary<string, string> GetDropDownSchema()
    {
        return new Dictionary<string, string> { {"ddClient", "guisp_SelectClientDropDown"}, {"ddType", "guisp_SelectTypeDropDown"}, {"ddCounty", "guisp_SelectCountyDropDown"}};
    }

    public void BindComboBoxes()
    {
        var ddSchem = GetDropDownSchema();
        foreach (var dd in ddSchem) { 
            var dt = new DataTable();
            using (var con = new SqlConnection(ConStr)) {
                try {
                    var adapter = new SqlDataAdapter(dd.Value, con);
                    adapter.Fill(dt);

                    ((ComboBox)Controls.Find(dd.Key, true)[0]).DataSource = dt;
                    ((ComboBox)Controls.Find(dd.Key, true)[0]).DisplayMember = "DisplayText";
                    ((ComboBox)Controls.Find(dd.Key, true)[0]).ValueMember = "ID";

                }
                catch //(Exception ex)
                {
                     //Code is not throwing any exception, just doesn't work
                }

            }
        }

我确信我错过了一些简单的东西。我很感激任何帮助或建议,以更优雅的方式来解决这个问题。

由于

1 个答案:

答案 0 :(得分:1)

我认为guisp_XXXXXX是存储过程的名称。如果是这种情况,则不能以这种方式使用它们来使用SqlDataAdapter填充数据表。

相反,您需要构建一个SqlCommand,指定其CommandType是StoredProcedure并将该命令分配给SqlDataAdapter的SelectCommand属性

using (var con = new SqlConnection(ConStr)) 
{
    try 
    {
        con.Open();
        var adapter = new SqlDataAdapter();
        var cmd = new SqlCommand(dd.Value, con);
        cmd.CommandType = CommandType.StoredProcedure;
        adapter.SelectCommand = cmd;
        adapter.Fill(dt);
        ......