2016-08-13 45 views
1

因此,您可以將各種字段綁定到這樣的ComboBox,以便ComboBox的選定值將自動填充文本字段。有沒有辦法使用實體框架將DataGridView上的單個列綁定到數據庫中的表上?

var SID = Convert.ToInt32(cbosSID.Text); 
using (Entities2 db = new Entities2()) 
{ 
    var student = (from a in db.Students where a.SID == SID select a).First(); 
    txtsFName.Text = student.FName; 
    txtsLName.Text = student.LName; 
    txtsPhone.Text = student.Phone; 
    txtsAdd1.Text = student.Add1; 
    txtsAdd2.Text = student.Add2; 
    txtsState.Text = student.State; 
    txtsSuburb.Text = student.Suburb; 
    txtsPost.Text = student.Postcode; 
    dteDOB.Value = student.DOB; 
    dteStart.Value = student.SDate; 
} 

可以做,以與其單獨列DataGridView是一回事嗎?

我已經在DataGridView,學號和標記中添加了兩列。我試圖使用editDataGridView.Columns[course.SID].DataPropertyName = "clmSID";來做到這一點,但這不起作用。

private void cboeCID_SelectedIndexChanged_1(object sender, EventArgs e) 
{ 
    var CID = Convert.ToInt32(cboeCID.Text); 
    using (var db = new Entities2()) 
    { 
     var course = (from a in db.Student_Course where a.CID == CID select a).First(); 
     editDataGridView.Columns[course.SID].DataPropertyName = "clmSID"; 
     editDataGridView.Columns[course.Mark].DataPropertyName = "clmMark"; 
    }; 
} 
+1

它看起來像你需要像下面這樣的東西http://stackoverflow.com/questions/1228539/how-to-bind-list-to-datagridview – Igor

+0

你想在網格,列表或單個記錄中顯示什麼?您從查詢中選擇了「.First」,但您似乎需要在網格中顯示一個列表。你能解釋更多關於你的要求嗎? –

+0

@RezaAghaei我希望能夠以類似於第一種方法的方式自動填充datagridview列。當更改組合框的選定值時,datagridview中的值將隨之更改。然後,我將得到一個保存/編輯按鈕,以將對datagridview所做的任何信息更改保存回數據庫。 – Anon

回答

1

考慮這個提示:

  • 要顯示DataGridView一個List<T>,它足以把它分配給電網的DataSource
  • 當您指定List<T>到沒有爲它定義列的DataGridView,默認情況下,網格將顯示的List<T>
  • 所有可瀏覽的特性,僅顯示一些列的,你可以考慮一下這款解決方案:

    ○可以使用設計器或代碼定義列,並將列的DataPropertyName屬性設置爲要在列中顯示的屬性名稱。這種方式只有這些列將被添加到DataGridView

    ○您可以讓列自動生成,然後刪除或隱藏那些您不想顯示的列。

  • 當您在使用block創建上下文,你將會失去跟蹤改變使用上下文的能力。如果你只想在網格中顯示數據,那就OK了。但是,如果您想要顯示數據並編輯和保存更改,則不應以此方式定義上下文。相反,您應該在表單級別創建一個您的上下文類型的字段,並將其初始化爲表單的Load事件,並將其用於加載和保存數據。

在這裏,我發佈樣本使用CategoryProduct是更一般的。

Category: Id, Name 
Product : Id, Name, CategoryId, Price, Description 
Relation: Categry [1]---[*] Product 

在下面的代碼,第一我們定義db作爲日提交的Form並且將在Load事件形式的初始化。這樣,它可以跟蹤更改。另外,當執行數據與ComboBox這種方式結合:

SampleDbEntities db; 
void Form1_Load(object sender, EventArgs e) 
{ 
    db = new TestDBEntities(); 
    var categories = db.Category.ToList(); 
    this.comboBox1.ValueMember = "Id"; 
    this.comboBox1.DisplayMember = "Name"; 
    this.comboBox1.DataSource = categories; 
} 

然後處理SelectedIndexChanged事件基於的ComboBox選定值ComboBox和負載Product實體。在下面的代碼中,我們只將顯示在DataGridView「價格」和「名稱」列:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (this.comboBox1.SelectedValue == null) 
     return; 
    var desiredColumns = new[] { "Price", "Name" }; 
    var id = (int)this.comboBox1.SelectedValue; 
    var data = db.Product.Where(x => x.CategoryId == id).ToList(); 
    dataGridView1.DataSource = data; 
    dataGridView1.Columns.Cast<DataGridViewColumn>() 
       .Where(x => !desiredColumns.Contains(x.DataPropertyName)) 
       .ToList().ForEach(x => { x.Visible = false; }); 
} 

要保存更改,處理Click事件按鈕,寫這樣的代碼:

private void button1_Click(object sender, EventArgs e) 
{ 
    dataGridView1.EndEdit(); 
    db.SaveChanges(); 
} 
相關問題