2013-09-26 3 views
1

У меня есть форма с матрицей текстовых полей для ввода чисел. Хотя это, безусловно, упростило бы просто использование DataGridView, мне сказали, что это не вариант.Как связать элемент управления с определенной ячейкой DataTable, а не с конкретным столбцом в активной строке?

Обычно мы привязываемся к DataTable в DataSet. С 15 строками и 5 столбцами, это 75 столбцов Мне нужно будет добавить в DataTable элементы управления формы. То, что я хотел бы сделать, это сделать отдельный DataTable в DataSet для этих элементов управления, дать ему 15 DataRows & 5 DataColumns и просто привязать каждый элемент к соответствующей строке & столбца DataTable.

К сожалению, я не вижу никакого способа привязки к определенной ячейке ; Я могу привязывать элементы управления только к определенному столбцу в DataTable, а затем он использует любую «активную» строку. Я что-то упустил или это действительно невозможно?

This question Предполагается, что он выполнен в XAML (который мы не используем), и поэтому теоретически он может быть выполнен в C# (либо через Visual Studio Form Designer, либо программно).

This answer в другой вопрос (при условии, что я его правильно читаю) предполагает, что это может быть сделано каким-то образом с BindingSource, но неясно, как это сделать. BindingSource не позволит мне привязать его к определенному DataTable в DataSet, только самому DataSet (чтобы уточнить: я не не, столкнувшись с проблемой получения элементов управления для привязки к DataTables), и я не могу показаться получить контроль для привязки к BindingSource. Я делаю что-то неправильно?

Редактировать: Чтобы уточнить, я ищу двустороннюю привязку, где любое изменение элемента управления обновляет связанную ячейку и любое изменение связанной ячейки обновляет элемент управления.

+0

Просто fyi, столбец и строка, можно назвать ячейкой. Таким образом, вы хотите привязать текстовые поля к отдельным ячейкам данных. – Khan

+0

@Khan Хороший улов, поскольку я не мог использовать DataGridView, о котором я не думал в терминах ячеек, но да, ячейка - это то, к чему я хочу привязываться. –

+0

Возможно, использовать несвязанные элементы управления и написать код для загрузки/сохранения значений управления в datatable? – rheitzman

ответ

-1

Ну, на самом деле вы можете использовать eventDataTable для привязки данных здесь. События, которые я хочу здесь упомянуть, - ColumnChanged. Обработчик этого события может получить Column и клетки, которая имеет что-то изменилось с помощью 2-го аргумента, переданного в Вот код для вас:.

//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 из Control или некоторых событий изменений, таких как уведомляющими TextChanged.

+0

Я ищу двустороннюю привязку, но это похоже на то, что стоит исследовать. –

+0

@ Необычный сюжет да, как я указал на то, как достичь другого пути. Я уверен, что это возможно **. Я также думаю, что это единственный способ, вы должны написать свой собственный код. Нет ** уже простой способ ** привязать ячейку к управлению, как вы хотите. Фактически, ** DataGridView ** имеет ту же внутреннюю реализацию, что и привязка ячейки к управлению (каждый элемент управления здесь можно рассматривать как «DataGridViewCell»). –

Смежные вопросы