2012-03-31 4 views
3

В принципе, когда я создаю этот DataGridView у меня есть этот код, чтобы заполнить егоDataGridView Изменение DataSource Динамическое

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()); 

Но когда я нажимаю button Я хочу изменить его содержимое на что-то похожее в этом запросе

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 button Это будет сделано, но это не обновление datagrid, почему это так? fillDataGrid (searchPatient());

+1

Это окна форм? –

+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 Schema каждый раз при обновлении источника.

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

+0

Если все ваши запросы возвращают PatientInfo, тогда да - вот и все. Контейнер данных фиксирован, только данные изменены. –

+0

можете ли вы объяснить свой код? BindingList и AddRange. – user962206

2

Вместо если делать

DataSource = null 

его лучше обновить менеджер валюты, учитывая IQueryable возвращается CurrencyManager:

(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

Смежные вопросы