2012-03-31 107 views
3

基本上當我創建這個DataGridView中我有這樣的代碼來填充它的DataGridView更改數據源動態

public void fillDataGrid(IQueryable<PatientInfo> patients) { 

      dgvMyPatients.DataSource = patients; 

      dgvMyPatients.Columns["Pat_Last_Name"].DisplayIndex = 0; 
      dgvMyPatients.Columns["Pat_First_Name"].DisplayIndex = 1; 
      dgvMyPatients.Columns["Pat_Middle_Name"].DisplayIndex = 2; 
      dgvMyPatients.Columns["Pat_First_Name"].HeaderText = "First Name"; 
      dgvMyPatients.Columns["Pat_Last_Name"].HeaderText = "Last Name"; 
      dgvMyPatients.Columns["Pat_Middle_Name"].HeaderText = "Middle Name"; 

     } 

public IQueryable<PatientInfo> showMyPatients() { 

      DbClassesDataContext myDb = new DbClassesDataContext(dbPath); 

      var patientInfo = from patients in myDb.PatientInfos 
           where patients.Phy_ID == physcianID 
           select patients; 

      return patientInfo; 
     } 

所以,當我創建我的對象我只是這樣做

fillDataGrid(showMyPatients()); 

但是當我點擊按鈕我想將其內容更改爲類似於此查詢中的內容

private IQueryable<PatientInfo> searchPatient() { 

     DbClassesDataContext myDb = new DbClassesDataContext(dbPath); 
     var search = from myPatients in myDb.PatientInfos 
        where (myPatients.Pat_ID == patient_ID && myPatients.Pat_First_Name.Contains(txtSearch.Text)) || 
        (myPatients.Pat_ID == patient_ID && myPatients.Pat_Last_Name.Contains(txtSearch.Text)) || 
        (myPatients.Pat_ID == patient_ID && myPatients.Pat_Middle_Name.Contains(txtSearch.Text)) 
        select myPatients; 

     return search; 
    } 

然後當我單擊m Ÿ按鈕它會這樣做,但它不會更新數據網格爲什麼? fillDataGrid(searchPatient());更新前

DataSource = null; 

+1

它是Windows窗體嗎? – 2012-03-31 17:14:54

+0

是的,它是在Windows窗體 – user962206 2012-03-31 17:17:39

+0

召喚「dgvMyPatients.Refresh」更新數據源 – 2012-03-31 17:26:15

回答

-1

首先,你可以嘗試設置。我個人建議使用BindingList將數據綁定到dataGridView。這樣,您不必更改dataSource - 僅包含其中包含的數據。它的用法如下:

BindingList<PatientInfo> data = new BindingList<PatientInfo>(); 
dgvMyPatients.DataSource = data; 

... 
public void fillDataGrid(IQueryable<PatientInfo> patients) 
{ 
    data.Clear(); 
    data.AddRange(patients); 
} 

此外,每次更新源代碼時,都不需要提供datagrid架構。

UPDATE

工作樣本:

public partial class Form1 : Form 
{ 
    private BindingList<SomeClass> _data = new BindingList<SomeClass>(); 
    public Form1() 
    { 
     InitializeComponent(); 

     dataGridView1.DataSource = _data; 
     _data.Add(new SomeClass() { First = "1", Second = "1", Third = "1" }); 
     _data.Add(new SomeClass() { First = "2", Second = "2", Third = "2" }); 
     _data.Add(new SomeClass() { First = "3", Second = "3", Third = "3" }); 
     _data.Add(new SomeClass() { First = "4", Second = "4", Third = "4" }); 
     _data.Add(new SomeClass() { First = "5", Second = "5", Third = "5" }); 
     _data.Add(new SomeClass() { First = "6", Second = "6", Third = "6" }); 
     _data.Add(new SomeClass() { First = "7", Second = "7", Third = "7" }); 
     _data.Add(new SomeClass() { First = "8", Second = "8", Third = "8" }); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     _data.Clear(); 
     _data.Add(new SomeClass() { First = "11", Second = "11", Third = "11" }); 
     _data.Add(new SomeClass() { First = "21", Second = "21", Third = "21" }); 
     _data.Add(new SomeClass() { First = "31", Second = "31", Third = "31" }); 
    } 
} 

public class SomeClass 
{ 
    public string First { get; set; } 
    public string Second { get; set; } 
    public string Third { get; set; } 
} 
+0

後將即使我有不同的查詢,因爲我有兩個不同的查詢這項工作。 – user962206 2012-03-31 17:24:20

+0

如果您的所有查詢都返回PatientInfo,那麼是的 - 這就是整個問題。您的數據容器已修復,只有數據發生更改。 – 2012-03-31 17:25:30

+0

你可以進一步解釋你的代碼嗎? BindingList和AddRange。 – user962206 2012-03-31 18:47:09

2

相反,如果這樣做

DataSource = null 

其更好地刷新貨幣經理,給出的IQueryable返回的CurrencyManager:

(dgvMyPatients.BindingContext[dataGridView1.DataSource] as CurrencyManager).Refresh(); 

CurrencyManager

CurrencyManager.Refresh()

+0

它仍然沒有做任何事情。 – user962206 2012-04-01 07:29:26

0

更改行:

dgvMyPatients.DataSource = patients; 

dgvMyPatients.DataSource = typeof(List<>); 
dgvMyPatients.DataSource = patients.ToList(); 
3

有同樣的疑問,搜索一段時間後,終於找到了答案:

 DataTable dt = new DataTable(); 
     dt.Columns.Add("Column One"); 

     dt.Rows.Add(new object[] { "Item1" }); 
     dt.Rows.Add(new object[] { "Item2" }); 
     dt.Rows.Add(new object[] { "Item3.3" }); 

     this.dataGridView1.AutoGenerateColumns = true; 
     this.dataGridView1.Columns.Clear(); 

     //dataGridView1.DataSource = null; 
     dataGridView1.DataSource = dt; 

AutoGenerateColumns需要是真的,就是這樣。

+0

這對我有用。 – orad 2017-07-03 01:53:46