2010-07-07 52 views
1

在DataGridView的選定行背後檢索Linq實體的優雅/正確的方法是什麼? 我填充我的DataGridView這樣的形式Load事件:從Linq到Linq的DataGridView中選定的行後面的實體

this.Database = new MyAppDataContext(); 
var userList = from c in this.Database.Users 
         orderby c.LastName 
         select c; 
     this.gridUserList.DataSource = userList; 

然後,在形式的DoubleClick事件我這樣做:

 int userPK = Convert.ToInt32(this.gridUserList.CurrentRow.Cells["colUserPK"].Value); 
     var user = (from c in this.Database.Users 
        where c.UserPK == userPK select c).First() ; 
     //Do something with user object 

看起來應該有一個更獲得雙擊用戶行的優雅方式。

+0

你的問題是什麼?你是否遇到異常?你想用用戶對象做什麼?請與我們分享更多信息。 – 2010-07-08 06:54:43

+0

我看到的問題是我無法以乾淨,強類型,面向對象的方式到達選定的用戶對象。一種理論上改進的方法是在表單上擁有一個UserList屬性,該屬性是Linq查詢對象。即「this.UserList = from this.Database.Users .....」等,並將網格數據源設置爲this.UserList。然後在DoubleClick事件中,可以說「var User = UserList.CurrentEntity」或「var User = UserList.SelectedEntity」或類似的東西。無論如何,我是Linq的新手,仍在學習和研究,並尋找意見。 – 2010-07-08 13:25:16

回答

5

這裏是我發現最好的選擇:

var selectedUser = (User)this.userBindingSource.Current; 
1

我已經綁定MyDataSourceTabledataGridView1

var selectedUser = (User)this.gridUserList.CurrentRow.DataBoundItem; 

另一種選擇,如果你正在使用的BindingSource是。 C#代碼如下所示:

List<MyDataSourceItem> MyDataSourceTable; 
bs = new BindingSource(); 
bs.DataSource = MyDataSourceTable; 
dataGridView1.DataSource = bs; 

當我的程序的用戶選擇上dataGridView1一排,我們知道哪一行,因爲我們有行索引。

private void dataGridView1_CurrentCellChanged(object sender, EventArgs e) 
{ 
    if (this.dataGridView1.SelectedRows.Count <= 0) return; // this line prevents exception 
    MyDataSourceItem mdsi = (MyDataSourceItem)this.dataGridView1.CurrentRow.DataBoundItem; // Alvin S 
    // mdsi now reference the corresponding object on the list 
    . 
    . 
} 

爲了保護被拋出上null對象的異常,被添加的if子句:使用上述發佈應答,在數據源中的相應條目僅由一個一行代碼引用。阿爾文S的回答非常直接和簡潔。這很有價值。