DataGridView Изменение источника данных динамически - PullRequest
3 голосов
/ 31 марта 2012

В основном, когда я создаю этот 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;
    }

Тогда, когда я нажму на мою кнопку, это будет сделано, но это не обновляет сетку данных, почему это так?fillDataGrid (searchPatient ());

Ответы [ 4 ]

3 голосов
/ 07 ноября 2016

У меня была такая же проблема, после того как я некоторое время искал и тестировал, наконец нашел решение:

        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 должно быть true, вот и все.

2 голосов
/ 31 марта 2012

Вместо этого при выполнении

DataSource = null

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

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

CurrencyManager

CurrencyManager.Refresh ()

0 голосов
/ 05 декабря 2012

Изменить строку:

dgvMyPatients.DataSource = patients;

К

dgvMyPatients.DataSource = typeof(List<>);
dgvMyPatients.DataSource = patients.ToList();
0 голосов
/ 31 марта 2012

Например, вы можете попробовать установить:

DataSource = null;

перед обновлением. Я лично рекомендую использовать BindingList для привязки ваших данных к dataGridView. Таким образом, вам не нужно менять источник данных - только данные, содержащиеся в нем. Используется так:

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

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

Кроме того, вам не нужно вводить схему сетки данных при каждом обновлении источника.

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