Winform Datagridview не отображает данные - PullRequest
0 голосов
/ 15 мая 2018

Данные привязки не работают для моего просмотра данных.

Вот файл .cs

using FirebirdSql.Data.FirebirdClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Magacin
{
    public partial class AnalizaPartneraGlobal : Form
    {
        List<Int_String> partneri = Komercijalno.Partner.Lista();
        List<NeaktivniPartner> neaktivniPartneri = new List<NeaktivniPartner>();
        public AnalizaPartneraGlobal()
        {
            InitializeComponent();
            dataGridView1.AutoGenerateColumns = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            foreach(Int_String partner in partneri)
            {
                double danaBezProdaje = (DateTime.Today - Komercijalno.Partner.PoslednjaKupovina(partner._int)).TotalDays;
                if ( danaBezProdaje > 31)
                {
                    NeaktivniPartner np = new NeaktivniPartner();
                    np.ppid = partner._int;
                    np.naziv = partner._string;
                    np.danaBezKupovine = danaBezProdaje;
                    neaktivniPartneri.Add(np);
                }
            }
            dataGridView1.DataSource = M.List.ConvertToDataTable(neaktivniPartneri);
            dataGridView1.Refresh();
        }
    }

    public class NeaktivniPartner
    {
        public int ppid;
        public string naziv;
        public double danaBezKupovine;
    }
}

Как видите, у меня есть только button и dataGridView

Если я вспоминаю ранее, я делал dataGridView.dataSource = myGenericList;, работал отлично, но по какой-то причине сейчас он не работает, поэтому я попытался преобразовать его в DataTable, но все еще не работал. Затем я добавил AutogenerateColumns и до сих пор не отображаются данные или столбцы. И после этого попытался добавить Refresh(), но все равно ничего.

В отладчике показано, что в datagridview есть строки: enter image description here

Помимо этого я попробовал:

  • Удаление dagagview и сделать все снова
  • Закройте VS и снова откройте его
  • Пробовал делать это с BindingList
  • Попытка привязки списка к источнику данных напрямую

Код позади ConvertToDataTable

public static DataTable ConvertToDataTable<T>(IList<T> data)
{
        PropertyDescriptorCollection properties =
           TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        foreach (PropertyDescriptor prop in properties)
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        foreach (T item in data)
        {
            DataRow row = table.NewRow();
            foreach (PropertyDescriptor prop in properties)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        }
        return table;
    }

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

JohnG упомянул проблему в комментариях, но я выложу полный ответ здесь.

Таким образом, решение было вместо этого:

public class NeaktivniPartner
{
    public int ppid;
    public string naziv;
    public double danaBezKupovine;
}

Я установил это:

public class NeaktivniPartner
{
    public int ppid { get; set; }
    public string naziv { get; set; }
    public double danaBezKupovine { get; set; }
}
0 голосов
/ 15 мая 2018

Вы должны использовать BindingSource в качестве источника данных для вашего DataGridView. Кроме того, метод Refresh элемента управления предназначен для отображения элемента управления и не влияет на его источник данных.

Вот простой пример:

public partial class Form1 : Form
{
    private List<TestModel> _dataList = new List<TestModel>();
    private BindingSource _binding = new BindingSource();

    public Form1()
    {
        InitializeComponent();

        dataGridView1.AutoGenerateColumns = true;
        _binding.DataSource = _dataList;
        dataGridView1.DataSource = _binding;
    }

    private int _counter = 0;
    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 5; i++)
        {
            _counter++;
            _dataList.Add(new TestModel()
            {
                ID = _counter,
                Name = "Name " + _counter
            });
        }
        _binding.ResetBindings(false);
    }

    private class TestModel
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...