2012-03-31 5 views
3

基本的に私は、このDataGridViewのを作成するとき、私は私のオブジェクトを作成するときに、私はちょうどこのDataGridViewの

fillDataGrid(showMyPatients()); 

を行う

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; 
     } 

をそれを埋めるために、このコードを持っているしかし、私はクリックするとボタンこの内容の内容をこのクエリのように変更したい

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 yボタンこれを行いますが、それはなぜdatagridを更新していませんか? fillDataGrid(searchPatient());

+1

Windowsフォームですか? –

+0

はいそれは窓の形であります – user962206

+0

データソースを更新した後に 'dgvMyPatients.Refresh'を呼び出す –

答えて

-1

一つは、あなたが設定してみてください可能性:

DataSource = null; 

それを更新する前に。私は個人的に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

私は2つの異なるクエリを持っているので、私は異なるクエリを持っています。 – user962206

+0

すべてのクエリがPatientInfoを返す場合は、yesを指定します。データコンテナは固定されており、データのみが変更されます。 –

+0

あなたのコードをさらに説明できますか? BindingListとAddRangeです。 – user962206

2

代わりにその通貨マネージャをリフレッシュするために、与えられたのIQueryableを返すより良いのCurrencyManager

DataSource = null 

をやっている場合:

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

CurrencyManager

CurrencyManager.Refresh()

+0

まだ何もしていません。 – user962206

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