1

我有一个带有用于输入数字的文本框矩阵的表单。虽然只使用 DataGridView 肯定会简化事情,但有人告诉我这不是一个选择。

我们通常绑定到 DataSet 中的 DataTable。有 15 行和 5 列,我需要将75 列添加到表单控件绑定到的 DataTable 中。我想做的是在数据集中为这些控件创建一个单独的数据表,给它 15 个数据行和 5 个数据列,然后将每个控件绑定到数据表的相应行和列。

不幸的是,我没有看到任何绑定到特定单元格的方法;我只能将控件绑定到 DataTable 中的特定,然后它使用任何“活动”行。我错过了什么或者这真的不可能吗?

这个问题似乎表明它在 XAML 中是可行的(我们没有使用它),因此理论上应该在 C# 中是可行的(通过 Visual Studio 的表单设计器或以编程方式)。

This answer to another question(假设我正在正确阅读)表明它可以通过BindingSource以某种方式完成,但目前尚不清楚如何。BindingSource 不会让我将它绑定到 DataSet 中的特定 DataTable,只有 DataSet 本身(澄清:我在将控件绑定到 DataTables 时没有任何问题),而且我似乎无法控制绑定到 BindingSource。难道我做错了什么?

编辑:为了澄清,我正在寻找一种双向绑定,其中对控件的任何更改都会更新绑定单元格,对绑定单元格的任何更改都会更新控件。

4

1 回答 1

-1

好吧,其实你可以在这里使用一些eventDataTable绑定数据。我想在这里提到的事件是ColumnChanged。此事件的事件处理程序可以通过传入的第二个参数获取已更改的单元格的ColumnRow。这是给您的代码:

    //This is just a demo without check for valid cell (with RowIndex and ColumnIndex in range)
    public class CustomDataTable : DataTable
    {
        public Dictionary<Cell, Control> CellBindings { get; private set; }
        public CustomDataTable()
        {
            CellBindings = new Dictionary<Cell, Control>();
        }
        protected override void OnColumnChanged(DataColumnChangeEventArgs e)
        {                
            Cell cell = new Cell {RowIndex = Rows.IndexOf(e.Row), ColumnIndex = e.Column.Ordinal};
            Control c;
            if (CellBindings.TryGetValue(cell, out c))
            {
                c.Text = e.Row[e.Column].ToString();
            }
            base.OnColumnChanged(e);
        }
        public struct Cell
        {
            public int RowIndex { get; set; }
            public int ColumnIndex { get; set; }
            public Cell(int rowIndex, int colIndex) : this()
            {
                RowIndex = rowIndex;
                ColumnIndex = colIndex;
            }
        }
    }
    //Use it
    //Bind cell at (2,0) to the textBox1
    customDataTable.CellBindings.Add(new CustomDataTable.Cell(2, 0), textBox1);

注意:代码仅用于单向绑定,从DataTableControl. 如果你想要双向绑定我们必须添加更多代码。我没有时间深入研究这个问题。但我想分享实现它的想法。绑定 from DataTableto的Control方式已经如上所示,但是绑定 from Controlto的方式DataTable可以通过DataBindingsofControl或一些通知更改的事件来完成,例如TextChanged.

于 2013-09-26T17:13:42.373 回答