Vegar
Vegar

Reputation: 12898

c#: How to pass linq-objects around

When showing my main window, I make a list of objects from linq-to-sql:

 using (var context = new Data.TVShowDataContext())
 {
    Shows = new ObservableCollection<Data.Show>(context.Shows);
    listShows.ItemsSource = Shows;
 }

Now, when I doubleclick an item in my list, I want to use the selected object in a new usercontrol:

 ShowEpList epList = new ShowEpList();
 epList.DataContext = (Data.Show)listShows.SelectedItem;

Now, this results in an exception:

System.ObjectDisposedException was unhandled
Message="Cannot access a disposed object.\r\nObject name: 'DataContext accessed after Dispose.'."
Source="System.Data.Linq"
ObjectName="DataContext accessed after Dispose."

I guess this comes as a result of binding a list to the shows season-list, and the season-list needs to be populated or something:

<ListBox Name="listSeasons" ItemsSource="{Binding Seasons}"/>

Now, what I would like to know, is how this is supposed be done? Would I need to make a new DataContext-object and retrieve the selected show again, or is it possible to re-conntect my show with a new datacontext to populate the seasons-list?

I guess I'm a little lost....

Upvotes: 5

Views: 6415

Answers (4)

Bobby McD
Bobby McD

Reputation:

Actually there are valid reasons to use those objects apart from the datacontext. what about passing the objects back to a web service call?

Upvotes: 0

AnthonyWJones
AnthonyWJones

Reputation: 189535

Is there a reason you can't maintain the DataContext object for longer, hold it perhaps as Resource in the page. Ordinarily you wouldn't want a DataContext living too long however if it used only for queries relevant to the current page and is disposed with the page that may be a good compromise.

You would want to be careful in a multi-user environment where the backend values represented in the Datacontext change quickly. However I would think that TV Schedules don't keep changing rapidly.

Upvotes: 1

Adam Robinson
Adam Robinson

Reputation: 185703

When you use a using() block, it calls Dispose() on whatever you've put into its initializer (in this case, your context). When a LINQ to SQL context is disposed, the entities created with it are as well. I would suggest creating an instance variable on your Form for the context, and insert code into your Form's Dispose(bool) function (it's in the Designer.cs file) to dispose of the context.

Upvotes: 5

Jose Basilio
Jose Basilio

Reputation: 51548

Do not use a "using" statement with your datacontext. Please refer to this post: Disposing DataContext

Upvotes: 10

Related Questions