2012-06-01 4 views
3

Я назначаю DataTable в ViewState.ViewState автоматически обновляется при обновлении DataTable

public void Method1() 
{  
    DataTable dt = getData(); //Gets the Data 

    ViewState["dtThis"] = dt; 
} 

Теперь, когда 'method2' выполняет ViewState будет назначен DataTable.

public void Method2() 
{  
    DataTable dt2 = (DataTable)ViewState["dtThis"]; 

    dt2.Columns.Remove("FirstName"); //Removing a column 

    dt2.AcceptChanges(); 
} 

Теперь после выполнения method2 когда я проверяю (DataTable) ViewState ("dtThis") его имея DataTable dt2, даже если я не назначил dt2 назад ViewState ("dtThis"). (означает, что столбец - «FirstName» удален в DataSpace DataStyle ViewSate («dtThis»)).

Любая идея, почему этот тип поведения ViewState?

И как сохранить оригинальную ViewState?

+1

создание DataTable копии с использованием методы копирования ДТ поможет вам. – JSJ

ответ

6

Вы храните ссылку на datatable в viewstate. Так что все обновления, сделанные на viewstate["dtThis"], напрямую влияют на исходный Datatable obj, назначенный в method1().

Один из способов сохранить первоначальный вид государственной DataTable является использование DataTable.Copy(), чтобы создать точную копию оригинала и работать на этой реплике

+0

Так что же может быть решением? Даже я пробовал просто a = b; B = C; с = а; чтобы поддерживать исходные значения, но всегда обновляется в любом случае. – nirav

+0

Это относится только к DataTables в ViewState, или это применимо, если бы у меня был, например, пример (например, плохой пример) List в ViewState и обновлен элемент в списке? – lloydphillips

+0

Учитывая, как люди могут использовать ViewState, я не могу поверить, что это поведение не подсвечено. Red Any ViewState обсуждается. Я просто потратил слишком много времени, пытаясь понять, почему мой взгляд на данные [datatable] был сбит, пока я не натолкнулся на это. – JoeManiaci

1

Я не уверен, о причине, но это также случилось со мной, но при этом Я немного поспешил, поэтому я выбрал альтернативный путь. Когда я получаю данные из ViewState, я создал новую таблицу и зациклил записи исходной таблицы и установил значения в новой таблице :), поэтому моя таблица представлений осталась нетронутой.

+0

Я тоже пробовал. например - DataTable dt1 = ViewState ("dtThis"); DataTable dt_b = ViewState ("dtThis"); // Удаление столбцов из dt1; ViewState ("dtThis") = dt_b; Затем также dt_b и ViewState («dtThis»), я обновился. – nirav

+1

Сделайте это следующим образом: DataTable dt1 = ViewState ("dtThis"); DataTable dt_b = new DataTable(); Теперь проведите по столбцам dt1 и добавьте эти столбцы в dt_b, а затем переместитесь через строки dt1 и добавьте эти строки в dt_b, вот как я заставил его работать. –

0

использование, как это и решает проблему ссылка

DataTable dt2= ((DataTable)ViewState["dtThis"]).Copy(); 
+0

Разве это не голод, если фактический объем данных на самом деле большой? Потому что мы в конечном итоге копируем DataTable и создаем новый. – nirav

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