2012-03-31 3 views
3

Fondamentalement quand je crée ce DataGridView J'ai ce code pour le remplirDataGridView Changer DataSource Dynamiquement

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

Alors, quand je crée mon objet, je fais juste ce

fillDataGrid(showMyPatients()); 

Mais quand je clique sur un bouton Je veux changer son contenu à quelque chose comme dans cette requête

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

Ensuite, quand je clique sur m Bouton y Il le fera, mais il ne met pas à jour le DataGrid. Pourquoi? fillDataGrid (searchPatient());

+1

S'agit-il de formulaires Windows? –

+0

oui il est sous forme de Windows – user962206

+0

Appel 'dgvMyPatients.Refresh' après la mise à jour de la source de données –

Répondre

-1

Pour un, vous pouvez essayer de régler:

DataSource = null; 

avant sa mise à jour. Personnellement, je recommande d'utiliser BindingList pour lier vos données à un DataGridView. De cette façon, vous n'avez pas besoin de modifier dataSource - uniquement les données qu'il contient. Il est utilisé comme ceci:

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

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

De même, vous n'avez pas besoin d'alimenter le schéma DataGrid chaque fois que vous mettez à jour une source.

MISE À JOUR

échantillon de travail:

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

cela fonctionnera même si j'ai des requêtes différentes, car j'ai deux requêtes différentes. – user962206

+0

Si toutes vos requêtes renvoient PatientInfo, alors oui - c'est tout. Votre conteneur de données est fixe, seules les données sont modifiées. –

+0

pouvez-vous expliquer votre code? BindingList et AddRange. – user962206

2

lieu si cela

DataSource = null 

son mieux pour rafraîchir le gestionnaire de change, retourne IQueryable donné CurrencyManager:

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

CurrencyManager

CurrencyManager.Refresh()

+0

il ne fait toujours rien. – user962206

0

Modifier la ligne:

dgvMyPatients.DataSource = patients; 

Pour

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

ont la même question, après avoir fouillé un certain temps, a finalement trouvé la réponse:

 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 doit être vrai, c'est tout.

+0

Cela a fonctionné pour moi. – orad

Questions connexes