Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Повторный вызов DataAdapter.Fill / 25 сообщений из 25, страница 1 из 1
25.01.2005, 15:01
    #32882572
mucks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Имеется пустой dataSet.
Заливаю в него таблицу SqlAdapter.Fill(dataSet, "TableName")
Связываю таблицу с гридом, все прекрасно отображается.
Повторно вызываю SqlAdapter.Fill(dataSet, "TableName") который возвращает уже другие данные.
Грид отображает старые.
Что я не так делаю ?
Переприсвоение гриду свойств DataSource и DataMember, вызов SetDataBinding, предварительное удаление таблиц из датасета не помогают.
При просмотре в отладчике dataSet после второго вызова Fill содержит одну таблицу TableName, в которой содержатся верные данные. Грид также ссылается на верный датасет и прописан DataMember="TableName"
...
Рейтинг: 0 / 0
25.01.2005, 17:17
    #32883012
gerss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Попробуй
Код: plaintext
datagrid1.DataBind()
Сергей
...
Рейтинг: 0 / 0
25.01.2005, 17:57
    #32883119
mucks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Забыл уточнить. Я работаю с Windows.Forms
SetDataBinding в формах - это аналог DataBind в web, как я понимаю.
Это не помогло, как я говорил...
...
Рейтинг: 0 / 0
25.01.2005, 18:13
    #32883159
gerss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
mucksЗабыл уточнить. Я работаю с Windows.Forms
SetDataBinding в формах - это аналог DataBind в web, как я понимаю.
Это не помогло, как я говорил...

Пардон. Я в последнее время больше с web.

Может, стоит попробовать
Код: plaintext
1.
2.
3.
   datagrid1.ResetDatabindings();
   datagrid1.SetDataBindings(...);
   datagrid1.Update();

Это только предположения, сам с такой ситуацией не сталкивался.
...
Рейтинг: 0 / 0
25.01.2005, 18:40
    #32883222
mucks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Нет, не помогло.
Кстати, попутный вопрос, который должен помочь проблеме.
Если выполнить dataSet.Tables.Clear() , то грид продолжает отображать данные. Вопрос: откуда он их берет ?
...
Рейтинг: 0 / 0
25.01.2005, 21:39
    #32883412
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Привидите код, особенно интересует как осуществляется биндинг

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
26.01.2005, 10:59
    #32883955
mucks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Полный код довольно длинный. Вот часть, где таблица заполняется. Эта функция вызывается последовательно два раза с разным параметром. После первого раза работает, после второго грид гонит.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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 добавлены в поисках истины. Первый вызов прекрасно работает без них.
...
Рейтинг: 0 / 0
26.01.2005, 11:05
    #32883973
mucks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Заодно код CreateColumns
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
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);
	}

}
...
Рейтинг: 0 / 0
26.01.2005, 12:16
    #32884230
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Попробуйте вместо:
Код: plaintext
1.
dataGrid.SetDataBinding(dataSet, "Specification");
это:
Код: plaintext
1.
dataGrid.DataSource = dataSet.Tables["Specification"];
...
Рейтинг: 0 / 0
26.01.2005, 14:41
    #32884834
mucks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Спасибо, в этом случае работает.
Но все таки интересно, откуда грид берет данные, если таблицу удалили. Значит dataSet оставляет на нее ссылку где то и потом когда грид хочет получить dataMember = "Specification" возвращает именно ее. Больше мне ничего не приходит в голову. Может есть какой нибудь хитрый метод, который чистит dataSet от подобных вещей, а я о нем не знаю ?
...
Рейтинг: 0 / 0
26.01.2005, 14:58
    #32884891
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Но все таки интересно, откуда грид берет данные, если таблицу удалили. Значит dataSet оставляет на нее ссылку где то и потом когда грид хочет получить dataMember = "Specification" возвращает именно ее. Больше мне ничего не приходит в голову. Может есть какой нибудь хитрый метод, который чистит dataSet от подобных вещей, а я о нем не знаю ?


Это баг Netframework 1.1, а в багах искать логику - неблагодарное занятие :-)))

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
01.02.2005, 15:23
    #32894916
Han Yuriy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Возможно ты не очищал DataSet, "tablename". И каждый раз DataAdapter добавлял строки в конец таблицы "tablename". Может стоит попробовать ее очистить перед Fill ?
...
Рейтинг: 0 / 0
01.02.2005, 15:33
    #32894960
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Он не просто пытался очищать, но и также удалять таблицу из коллекции таблиц DataSet.

Это известный баг.

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
28.02.2005, 06:39
    #32935644
mysvetik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
у меня тоже возникла проблема по этой теме. грид не отображает новые данные при повторном fill. вы рекомендуете использовать вместо
SetDataBinding(datasourse,datamember) строчку
mygrid.Datasource = Mydataset.tables(datamember)
а если у меня грид завязан на отношении, то есть отображает дочерние записи? (datamember в этом случае равен имени родительской таблицы.имя отношения)
...
Рейтинг: 0 / 0
28.02.2005, 07:20
    #32935655
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
mysvetikу меня тоже возникла проблема по этой теме. грид не отображает новые данные при повторном fill
опиши по шагам - как ты делаешь повторный Fill ?
...
Рейтинг: 0 / 0
28.02.2005, 07:36
    #32935663
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
вы рекомендуете использовать вместо
SetDataBinding(datasourse,datamember) строчку
mygrid.Datasource = Mydataset.tables(datamember)

рекомендовали для случая описанного mucks , как будет у вас надо смотреть ваш код.

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
28.02.2005, 11:36
    #32936032
mysvetik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Задача в следующем: в датасете есть две таблички . Дело в том что изначально записей в этих табличках очень много (3млн). между этими табличками есть связь по нескольким полям. используется запрос для ограничения колич-ва записей (myQuery).
открывается соединение(либо OracleConnection, либо SqlConnection,либо OleDbConnection в зависимости от присоединяемой таблицы). используется соответствующий Dataadapter(приведу пример для оракла)
в датасет загружены две таблички, одна из которых с именем m_tab. Затем мы хотим присоединить ту же табличку но данные другие
m_nameRelation - имя текушего отношения между таблицами

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
daOra.SelectCommand = New OracleCommand(myQuery, oracleCn)
if mydataset.Tables.Contains(m_tab) Then
    If myDataSet.Relations.Contains(m_NameRelation) Then
        myDataSet.Relations.Clear()
    End If
    myDataSet.Tables.Remove(m_tab)
    myDataSet.AcceptChanges()
 End If
daOra.Fill(myDataSet, m_tab)
' добавляем отношение
' par_col() , child col() as datacolumn
myDataSet.Relations.Add(m_nameRelation, par_col, child_col, False)
myDataSet.AcceptChanges()
If myDataSet.Relations.Contains(m_NameRelation) Then
    Me.Datagrid1.DataSource = Nothing
    Me.Datagrid1.SetDataBinding(myDataSet, & _
    myDataSet.Relations.Item(m_NameRelation).ParentTable.TableName)
    Me.Datagrid2.DataSource = Nothing
    Me.Datagrid2.SetDataBinding(myDataSet, & _
    myDataSet.Relations.Item(m_NameRelation).ParentTable.TableName & _
    "." & m_NameRelation)
End If

На самом деле все сложнее, но смысл такой. В первый раз все срабатывает замечательно, затем мы выполняем данный код, с другим MyQuery. И на строчке Me.Datagrid2.SetDataBinding - проблема. данный грид ничего не отображает
...
Рейтинг: 0 / 0
28.02.2005, 21:09
    #32937392
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Я правильно понял, вы показываете Master - Detail .
Порционно вы обновляете данные первого грида, а данные для второго уже загружены ранее?

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
01.03.2005, 01:16
    #32937526
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
2 mysvetik
если у тебя при повторном заполнении структура таблицы не изменияется (выбираются те же поля), то можно обойтись
Код: plaintext
1.
myDataSet.Tables(m_tab).Clear()
daOra.Fill(myDataSet, m_tab)
при необходимости можно использовать установку myDataSet.EnforceConstraints для временного отключения контроля целостности данных
...
Рейтинг: 0 / 0
01.03.2005, 05:12
    #32937574
mySvetik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Да, я показываю Master-Detail.
Данные для одного грида уже загружены. я порционно обновляю данные второго грида. и при повторном заполнении структура может измениться (имеется ввиду что таблица та же но отображаемые поля в гриде могут меняться)
...
Рейтинг: 0 / 0
01.03.2005, 06:35
    #32937602
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
структура может измениться (имеется ввиду что таблица та же но отображаемые поля в гриде могут меняться)

На первый взгяд нехорошо это.... Это у вас одна таблица или повторный запрос может осуществляться к другой?

Теперь, что у вас является Master, а что Detail. Первый грид - Master, второй - Detail?????

В данном случае можно сделать все максимально просто:
1) Не использовать DataRelation
2) Подписаться на PositionChanged объекта CurrencyManager
3) Фильтровать записи используя свойство DataView.RowFilter

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
01.03.2005, 11:29
    #32938158
mySvetik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
Я попробовала не использоватьDataRelation.
Использовать PositionChanged объекта CurrencyManager.
В первом гриде у меня отображается главная таблица, во втором Detail (используя фильтр)
В общем то все получается, достаточно быстро и неплохо. Спасибо!
у меня вопрос, подскажите плиз, я хочу чтобы в первом гриде(то есть главном), не отображались строки, для которых нет подчиненных, а строки, для которых подчиненных больше 1, выделялись бы каким нить цветом. Такое можно реализовать?
...
Рейтинг: 0 / 0
01.03.2005, 11:41
    #32938194
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
mySvetik
я хочу чтобы в первом гриде(то есть главном), не отображались строки, для которых нет подчиненных,

не возвращайте такие строки запросом.
mySvetik
а строки, для которых подчиненных больше 1, выделялись бы каким нить цветом. Такое можно реализовать?

В принципе здесь тоже можно в запросе создать дополнительное поле, в котором указывать существует больше одной подчиненной записи или нет.

Далее можно обратиться к форуму VB.NET там помнится я приводил пример как раскрашивать DataGrid по определенному условию.

Если не найдете я помогу отыскать этот топик.

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
03.03.2005, 07:07
    #32942667
mySvetik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
я нашла топик, почитала.Спасибо.
как бы с раскраской все понятно, но как быть если мне нужно раскрасить ячейку по значению другой ячейки этой строки?
...
Рейтинг: 0 / 0
03.03.2005, 21:20
    #32944946
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторный вызов DataAdapter.Fill
А какой топик вы нашли?
И лучше по "раскраске грида" перевести обсуждение туда.

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Повторный вызов DataAdapter.Fill / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]