我有一个带有文本框矩阵的表单,用于输入数字。虽然它肯定会简化使用DataGridView的事情,但我被告知这不是一个选项。
我们通常绑定到DataSet中的DataTable。有15行和5列,那是 75列我需要添加到DataTable表单的控件绑定到。我想要做的是在DataSet中为这些控件创建一个单独的DataTable,给它15个DataRows& 5 DataColumns,只需将每个控件绑定到相应的行& DataTable的列。
不幸的是,我没有看到任何方法绑定到特定的单元格;我只能将控件绑定到DataTable中的特定列,然后它使用“活动”行的任何内容。我错过了什么或者这真的不可能吗?
This question似乎暗示它在XAML(我们没有使用)中是可行的,因此理论上应该在C#中可行(通过Visual Studio的表单设计器或以编程方式)。
This answer另一个问题(假设我正确地阅读它)表明它可以用BindingSource以某种方式完成,但目前尚不清楚如何。 BindingSource不允许我将它绑定到DataSet中的特定DataTable,只有DataSet本身(以澄清:我不在使控件绑定到 时遇到任何问题DataTables),我似乎无法获得绑定到BindingSource的控件。我做错了吗?
编辑:为了澄清,我正在寻找一种双向绑定,其中对控件的任何更改都会更新绑定的单元格,对绑定单元格的任何更改都会更新控件。
答案 0 :(得分:-1)
嗯,实际上你可以使用event
的{{1}}来绑定数据。我想在这里提到的事件是DataTable
。此事件的事件处理程序可以通过传入的第二个参数获取已更改内容的单元格的ColumnChanged
和Column
。以下是您的代码:
Row
注意:代码仅适用于单向绑定,从 //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);
到DataTable
。如果您想要双向绑定,我们必须添加更多代码。我没有时间深入研究这个问题。但我想分享实现它的想法。从Control
到DataTable
的绑定方式已经在上面进行了演示,但从Control
到Control
的绑定方式可以通过DataTable
DataBindings
完成1}}或某些事件通知更改,例如Control
。