【问题标题】:Bind multiple datatable columns to one multiline textbox将多个数据表列绑定到一个多行文本框
【发布时间】:2016-04-27 19:19:54
【问题描述】:

我正在尝试将文本框绑定到包含一行的数据表。但我希望文本框绑定到 4 列的串联。

我不确定是否可以在绑定期间不这样做。

下面这个工作正常,但我还希望将“SHIP_ADDRESS1”连接到我的多行文本框。

shipToTextbox.DataBindings.Add("Text",dataTbl, "SHIP_TO");

有没有办法在绑定过程中做到这一点?

已编辑:

我在 DataTable 中添加了一个扩展方法,如下所示:

public static DataTable Concatenates(this DataTable datatable, string columnName, params string[] columns)
    {
        var column = new DataColumn(columnName, typeof(String));
        datatable.Columns.Add(column);

        var concatenation = string.Empty;

        foreach (var c in columns)
        {
            if (string.IsNullOrEmpty(concatenation))
            {
                concatenation = datatable.Rows[0][c].ToString().Trim();
            }
            else
            {
                concatenation = concatenation + Environment.NewLine + datatable.Rows[0][c].ToString().Trim();
            }
        }

        datatable.Rows[0][column] = concatenation;

        return datatable;
    }

我这样称呼它:

shipToTextbox.DataBindings.Add("Text", dt.Concatenates("SHIP", "SHIP_TO", "SHIP_ADDRESS1", "SHIP_ADDRESS2", "SHIP_ADDRESS3"), "SHIP");

这是一个可接受的解决方案吗?有没有办法使用 LINQ 以更好的方式编写 Concatenate 扩展方法?

【问题讨论】:

  • 如果可能,创建一个自定义公共属性,它将返回连接的字符串。然后与该属性绑定。
  • 你不能在包含这个表达式的表中添加一个计算列吗:col.Expression="SHIP_TO - SHIP_ADDRESS1 - SHIP_ADDRESS2 ..."
  • 数据来自多个应用程序使用的视图,我不想更改它。在这种情况下,我认为我必须在 DataTable 级别进行

标签: c# data-binding binding datatable datatables


【解决方案1】:

如果您在谈论 xaml 框架,您可以使用 MultiValueConverters 和 ValueConverters。

但是,winforms 绑定会生成两个重要且有用的事件:Format 和 Parse。

将数据从源拉入控件时触发格式事件,将控件中的数据拉回数据源时触发解析事件。如果您处理这些事件,您可以在绑定期间来回更改/重新键入值。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 2013-12-31
相关资源
最近更新 更多