sher ali Ответов: 4

Чтобы создать копию источника данных bindingsource


Я использую VS2008, приложение Window Forms C#

Любой из них поможет мне создать копию уже созданного источника привязки и назначить ее вновь созданному DGV, потому что я использую несколько DGV в своем приложении, созданном во время выполнения, и каждый раз, когда ему нужны новые данные, поэтому я хочу отфильтровать существующий источник данных, создать его копию и назначить его DGV.

Пожалуйста, помогите мне.

Спасибо.

4 Ответов

Рейтинг:
35

lw@zi

После того, как вы сделали копию, вы хотите, чтобы обе копии работали как один источник или независимо друг от друга? Если вы хотите, чтобы они вели себя независимо, создайте копию существующего источника данных, используя следующий код, а затем отфильтруйте его и примените к другим Dgv.


MemoryStream memoryStream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(memorySteram, dataSourceObject);
newDataSource = formatter.Deserialize(memoryStream);


Member 14981275

некоторые наборы данных, такие как источники привязки, не будут копировать/клонировать таким образом специально в ADO.Net.

Рейтинг:
2

Henry Minute

Если только я не неправильно понял ваш вопрос, нет никакой необходимости "копировать" существующее BindingSource.

Что-то вроде:

BindingSource newBindingSource = new BindingSource();
newBindingSource.DataSource = oldBindingSource.DataSource;
newBindingSource.Filter = "FirstName = Smith";  // Or whatever

newDataGridView.DataSource = newBindingSource;


sher ali

потому что этот источник привязки привязан к другому DGV и когда любое изменение внесено в него то это изменение отражается на другом источнике DGV там я хочу копию этого источника привязки пожалуйста помогите мне спасибо

Henry Minute

Когда вы фильтруете BindingSource, вы изменяете базовый источник данных (обычно в памяти DataTable), поэтому на самом деле вы не хотите копировать BindingSource, который вы хотите скопировать, и для этого ответ от d@nish, вероятно, будет самым быстрым способом сделать это, с одной небольшой модификацией.

Попробуй:
Потоке MemoryStream потоке MemoryStream = новая потоке MemoryStream();
Класс binaryformatter форматирования = новый класс binaryformatter();
форматер.Сериализация(memoryStream, bsOld.DataSource);
поток памяти.Позиция = 0; // <=========== изменение из кода d@nish
BindingSource bsNew = новый BindingSource();
bsNew.DataSource = (DataTable)форматер.Десериализация(memoryStream);
бснью.Filter = "фамилия как 'D*'"; // или что-то еще

dgvNew.Источник данных = bsNew;

Espen Harlinn

Нравится, мой 5-й :)

Member 14981275

некоторые наборы данных, такие как источники привязки, не будут копировать/клонировать таким образом специально в ADO.Net.
потому что они не сериализуемы

Рейтинг:
2

Nima MirzaAliKhan

Этот вопрос у меня был давно и до сих пор. Я сделал для этого метод расширения.
Для BindingSource Заполняется Данными Из Базы Данных.
Этот Код Клонирует Структуру И Копирует Данные. Без всякой связи между ними.
и быстро.
правка: теперь вы можете копировать только отфильтрованные строки.

public static BindingSource Clone(
			this BindingSource bindingSource, 
			bool justFiltered)
		{
			try
			{
				DataTable tbl, tbl2;
				//
				if (justFiltered)
				{
					var dv =
					   ((System.Data.DataTable)bindingSource.DataSource).DefaultView;
					//Filter
					dv.RowFilter = bindingSource.Filter;
					tbl = dv.ToTable();
					tbl2 = tbl.Copy();
				}
				else
				{
					tbl = (DataTable)bindingSource.DataSource;
					tbl2 = tbl.Copy();
				}
				//
				BindingSource newBindingSource =
					new BindingSource(tbl2, bindingSource.DataMember);
				//
				return newBindingSource;
			}
			catch
			{
				
			}
			return null;
		}


Рейтинг:
1

RaviRanjanKr

Попробуйте это сделать, чтобы сделать копию BindingSource объект.

BindingSource newBindingSource = new BindingSource(oldBindingSource.DataSource, oldBindingSource.DataMember);


Nima MirzaAliKhan

@RaviRanjanKr это не клон и не копия. это связывание.