Источник данных - база данных Access;
Подключение к базе данных - через код;
После перетаскивания «узла» в TreeList порядковый номер «узла» обновляется в поле «сортировки».
Проблема: для перетаскиваемого узла поле «сортировка» в базе данных не обновляется.
Для остальных узлов одного и того же родителя обновление поля работает правильно.
Обновление
Статистика
Начальное состояние. Узел "Node_1" находится в "Parent_1".
"Parent_1" -> "Node_1" -> "Parent_2".
Перетащите узел «Node_1» из родительского «Parent_1» в «Parent_2».
Нумерация поля «сортировка» для узлов в таблице базы данных правильная.
"Parent_2". "Node_2" <-> "Node_1" <-> "Node_3".
Перетаскивание узла «Node_1» между дочерними узлами «Parent_2».
Для перетаскиваемого узла поле «сортировка» в базе данных не обновляется.
Для остальных узлов одного и того же родителя обновление поля работает правильно.
"Parent_1" <- "Node_1" <- "Parent_2". <br>
Перетаскивание узла «Node_1» из родительского «Parent_2» в «Parent_1» - в строке adapter.Update (dt);
ошибка: «Нарушение параллелизма: команда UpdateCommand затронула 0 из ожидаемых 1 записей».
Как заставить программу корректно обновлять поле «сортировка» при перетаскивании узла в древовидный список и в базу данных?
начальное состояние
drag
картинка с ошибкой
настройки
//
using DevExpress.XtraTreeList;
using DevExpress.XtraTreeList.Nodes;
namespace rsh
{
public partial class Form1 : Form
{
DataTable dt;
OleDbDataAdapter adapter;
OleDbCommandBuilder AccessCommandBuilder;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
connect();
//
UpdateNodesPositions(treeList1.Nodes);
treeList1.ExpandAll();
}
#region *** DB ***
public void connect()
{
string catBD = @"c:\test\visualStudio\csharp\01\01.accdb";
string conBD = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", catBD);
OleDbConnection connection = new OleDbConnection(conBD);
connection.Open();
string query1 = "SELECT * FROM TableTreeView_12";
OleDbCommand cmd1 = new OleDbCommand(query1, connection);
dt = new DataTable();
adapter = new OleDbDataAdapter(cmd1);
AccessCommandBuilder = new OleDbCommandBuilder(adapter);
adapter.Fill(dt);
treeList1.KeyFieldName = "ID";
treeList1.ParentFieldName = "PrID";
treeList1.DataSource = dt;
}
public void Save()
{
adapter.Update(dt);
}
#endregion *** DB ***
private void treeList1_AfterDragNode(object sender, DevExpress.XtraTreeList.AfterDragNodeEventArgs e)
{
SaveNewRecordPosition(e);
}
private void SaveNewRecordPosition(NodeEventArgs e)
{
var nodes = e.Node.ParentNode == null
? e.Node.TreeList.Nodes
: e.Node.ParentNode.Nodes;
richTextBox1.Clear();
for (var i = 0; i < nodes.Count; i++)
{
nodes[i].SetValue(0, i);
string id = nodes[i].GetValue(0).ToString();
string s = nodes[i].GetValue(1).ToString();
richTextBox1.Text += id + " -//- " + s + "\r\n";
}
Save();
}
private void UpdateNodesPositions(TreeListNodes nodes)
{
var ns = new List<TreeListNode>();
foreach (TreeListNode n in nodes)
{
ns.Add(n);
}
foreach (TreeListNode n in ns)
{
UpdateNodesPositions(n.Nodes);
n.TreeList.SetNodeIndex(n, Convert.ToInt32(n.GetValue("sorting")));
}
}
}
}