Повторный вызов DataAdapter.Fill
mucks
Дата: 25.01.2005 15:01:04
Имеется пустой dataSet.
Заливаю в него таблицу SqlAdapter.Fill(dataSet, "TableName")
Связываю таблицу с гридом, все прекрасно отображается.
Повторно вызываю SqlAdapter.Fill(dataSet, "TableName") который возвращает уже другие данные.
Грид отображает старые.
Что я не так делаю ?
Переприсвоение гриду свойств DataSource и DataMember, вызов SetDataBinding, предварительное удаление таблиц из датасета не помогают.
При просмотре в отладчике dataSet после второго вызова Fill содержит одну таблицу TableName, в которой содержатся верные данные. Грид также ссылается на верный датасет и прописан DataMember="TableName"
gerss
Дата: 25.01.2005 17:17:26
mucks
Дата: 25.01.2005 17:57:53
Забыл уточнить. Я работаю с Windows.Forms
SetDataBinding в формах - это аналог DataBind в web, как я понимаю.
Это не помогло, как я говорил...
gerss
Дата: 25.01.2005 18:13:33
mucks |
Забыл уточнить. Я работаю с Windows.Forms SetDataBinding в формах - это аналог DataBind в web, как я понимаю. Это не помогло, как я говорил... |
Пардон. Я в последнее время больше с web.
Может, стоит попробовать
datagrid1.ResetDatabindings();
datagrid1.SetDataBindings(...);
datagrid1.Update();
|
Это только предположения, сам с такой ситуацией не сталкивался.
mucks
Дата: 25.01.2005 18:40:42
Нет, не помогло.
Кстати, попутный вопрос, который должен помочь проблеме.
Если выполнить dataSet.Tables.Clear() , то грид продолжает отображать данные. Вопрос: откуда он их берет ?
Sa
Дата: 25.01.2005 21:39:52
Привидите код, особенно интересует как осуществляется биндинг
uid = Sa
mucks
Дата: 26.01.2005 10:59:15
Полный код довольно длинный. Вот часть, где таблица заполняется. Эта функция вызывается последовательно два раза с разным параметром. После первого раза работает, после второго грид гонит.
public void AddNodeToSpecification(BaseConstrNode parNode)
{
.... // здесь определяется строка locComString
//dataSet = new DataSet(); // если раскомментировать, то все работает.
dataGrid.DataMember = null;
dataGrid.DataSource = null;
dataGrid.ResetBindings();
dataSet.Tables.Clear();
SqlCommand locSqlCommand = new SqlCommand(locComString);
locSqlCommand.Connection = DataAccess.Connection;
SqlDataAdapter locSqlAdapter = new SqlDataAdapter();
locSqlAdapter.SelectCommand = locSqlCommand;
DataTable tempds = dataSet.Tables["Specification"];
locSqlAdapter.Fill(dataSet, "Specification");
dataSet.AcceptChanges();
dataGrid.DataSource = dataSet;
dataGrid.DataMember = "Specification";
CreateColumns(rootNode); // создает стили колонок и связывает их с узлами
//дерева (с каждым узлом связана одна колонка с информацией)
ShowNodeSpecification((BaseConstrNode)treeView.Nodes[0]); // добавляет стиль колонки для указанного узла в таблицу стилей грида
treeView.Nodes[0].Checked = true;
dataGrid.SetDataBinding(dataSet, "Specification");
dataGrid.Update();
dataGrid.Refresh();
}
|
Разнообразные Update, Refresh, AcceptChanges и переприсвоения DataSource добавлены в поисках истины. Первый вызов прекрасно работает без них.
mucks
Дата: 26.01.2005 11:05:08
Заодно код CreateColumns
public void CreateColumns(BaseConstrNode parNode)
{
String locTypeName = parNode.GetType().Name;
if (locTypeName == "GroupConstrNode" || locTypeName == "BoxesRootNode")
{
String locNewColumnExpression = "";
BoxCollection locNodeBoxes = parNode.GetBoxes();
DataColumn locNewColumn = new DataColumn(parNode.Text, typeof(int));
dataSet.Tables["Specification"].Columns.Add(locNewColumn);
if (parNode.UserObject == null)
{
DataGridTextBoxColumn locNewColumnStyle = new DataGridTextBoxColumn();
locNewColumnStyle.MappingName = locNewColumn.ColumnName;
locNewColumnStyle.HeaderText = parNode.Text;
parNode.UserObject = locNewColumnStyle;
}
DataGridTextBoxColumn locNewBoxColumnStyle;
foreach (BoxNode locNode in locNodeBoxes)
{
locNewColumnExpression = locNewColumnExpression + " + [" + locNode.ConstrUIN.ToString() + "]";
if (locNode.UserObject == null)
{
locNewBoxColumnStyle = new DataGridTextBoxColumn();
locNewBoxColumnStyle.MappingName = locNode.ConstrUIN.ToString();
locNewBoxColumnStyle.HeaderText = locNode.Text;
locNode.UserObject = locNewBoxColumnStyle;
}
}
locNewColumnExpression = locNewColumnExpression.Remove(0,2);
locNewColumn.Expression = locNewColumnExpression;
}
foreach (BaseConstrNode locNode in parNode.Nodes)
{
CreateColumns(locNode);
}
}
|
Sa
Дата: 26.01.2005 12:16:06
Попробуйте вместо:
dataGrid.SetDataBinding(dataSet, "Specification");
|
это:
dataGrid.DataSource = dataSet.Tables["Specification"];
|
mucks
Дата: 26.01.2005 14:41:22
Спасибо, в этом случае работает.
Но все таки интересно, откуда грид берет данные, если таблицу удалили. Значит dataSet оставляет на нее ссылку где то и потом когда грид хочет получить dataMember = "Specification" возвращает именно ее. Больше мне ничего не приходит в голову. Может есть какой нибудь хитрый метод, который чистит dataSet от подобных вещей, а я о нем не знаю ?