【问题标题】:bind dynamically created controls to datatable's data将动态创建的控件绑定到数据表的数据
【发布时间】:2013-08-02 11:40:19
【问题描述】:

我创建了一个表单设计器应用程序。你可以看到下面的截图。用户可以设计一个屏幕并用名称保存它。当用户保存表单时,应用程序只保存控件的类型(文本框、标签、按钮...)、名称、宽度、高度、位置 x、位置 y 等......

现在,我想让用户将 SQL SELECT STATEMENT 保存到应用程序中,然后让用户将该 SQL SELECT STATEMENT 中的数据表绑定到用户创建的控件。

可以说,用户已经保存了这个 SELECT 语句,如下所示

SELECT ID,NAME, LASTNAME FROM PERSONS

用户创建的表单有 3 个文本框。我怎样才能将它们相互绑定?

你们能给我一些线索吗?

【问题讨论】:

  • 用户把这条sql语句保存在哪里?在文本框或其他东西中?
  • 我将制作另一个带有大多行文本框的 winform 屏幕。这样用户甚至可以输入复杂的选择语句。我也会将这些选择语句存储在数据库中
  • 作为一个想法,您可以将此查询作为字符串获取,并且可以检查SELECT FROM之间的字数。然后你可以动态创建文本框。
  • 将数据绑定到控件需要明确指示哪个控件绑定到哪个字段/列,我认为这些信息也应该保存。

标签: c# winforms dynamic


【解决方案1】:

由于您直接从数据库中提取到单独的控件中,因此您可以避免数据绑定而直接填充您的文本框。

例如,当您的用户设计表单初始化时,您可以枚举所有TextBoxes

var textControls = Controls.OfType<TextBox>().ToList();

然后,当您实际执行 SELECT 语句时,您可以动态填充这些 TextBox 控件:

using (var conn = new SqlConnection())
{
    conn.Open();
    var command = new SqlCommand(selectStatement, conn);
    using (var rdr = command.ExecuteReader())
    {
        rdr.Read();
        int i = 0;
        while (i < rdr.FieldCount)
        {
            textControls[i].Text = rdr.GetString(i++);
        }
    }
}

上述代码的好处在于,无论您在用户设计的表单上有多少字段或文本框,它对于您创建的每个表单都是相同的。

如果您需要将结果保存回您的数据库,您可以在表单关闭时执行类似的过程:枚举您的 TextBoxes,为查询字符串构建参数,然后执行它。

同样,如果您想进行数据绑定,您可以创建一个List&lt;&gt; 字段,将 SQL 数据读入(而不是将其直接读入您的TextBox 控件)。然后,枚举TextBox控件并设置与List&lt;&gt;中对应字段的数据绑定。

【讨论】:

  • 好主意。但我想让用户从属于每个文本框的组合框中选择 FieldName。因为用户可能有一个带有 10 列和 5 个文本框的选择语句。因此,我希望他通过从组合框中进行选择来设置 TextBox 的字段名。这有意义吗?
  • @ayilmaz,当然,这可能没有那么不同,因为您可能有一个映射列表(哪个字段转到哪个文本框),您可以使用 1)找到正确的文本框和 2)从结果集中填充正确的字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 2018-11-16
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多