Привязка winForms + DataGridView к списку <T>(Visual Studio 2005, C # 2.0) - PullRequest
0 голосов
/ 11 января 2012

У меня есть следующий код, но DatGridView показывает мне пустые строки. Я не могу найти решение. Я установил AutoGenerateColumns на false. Если я установлю его на true, он создаст строки, но мне не разрешено устанавливать это свойство на true (желание клиента).

Что я делаю не так? Вот код:

public partial class Form1 : Form
{
    private List<AStruct> _aCollectionList;
    private BindingList<AStruct> _aCollectionBindingList;

    public struct AStruct
    {
        public string ACode
        {
            get { return _aCode; }
            set { _aCode = value; }
        }

        public string AName
        {
            get { return _aName; }
            set { _aName = value; }
        }

        private string _aCode;
        private string _aName;
    }

    public Form1()
    {
        InitializeComponent();
        this.dataGridView1.AutoGenerateColumns = false;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _aCollectionList = new List<AStruct>();
        FillCollectionStruct(true);

        dataGridView1.DataSource = _aList;
        dataGridView1.Refresh();            
    }

    private void button2_Click(object sender, EventArgs e)
    {            
        _aCollectionBindingList = new BindingList<AStruct>();
        FillCollectionStruct(false);
        dataGridView1.DataSource = _aBindingList;
        dataGridView1.Refresh();         
    }

    private void FillCollectionStruct(bool listBool)
    {
        AStruct aStruct = new AStruct();

        for (int i = 0; i < 10; i++)
        {
            aStruct.ACode = i.ToString();
            aStruct.AName = i.ToString();

            if (listBool)
                _aCollectionList.Add(aStruct);
            else
                _aCollectionBindingList.Add(aStruct);
        }
    }
}

В Form1.Designer я делаю следующие столбцы:

// 
// aCodeColumn
// 
this.colorCodeColumn.DataPropertyName = "Code";
this.colorCodeColumn.HeaderText = "a code";
this.colorCodeColumn.Name = "aCodeColumn";
// 
// aNameColumn
// 
this.colorNameColumn.DataPropertyName = "Name";
this.colorNameColumn.HeaderText = "a name";
this.colorNameColumn.Name = "aNameColumn";

Ответы [ 2 ]

0 голосов
/ 11 января 2012

Если я понимаю вашу проблему, напишите, что вы можете использовать sth как this.dataGridView1.Refresh (); чтобы заполнить его и перед обновлением строки, поместите this.dataGridView1.DataSource = _aCollectionBindingList;

0 голосов
/ 11 января 2012

Разве вы не можете просто изменить привязки с:

// aCodeColumn
// 
this.colorCodeColumn.DataPropertyName = "Code";
this.colorCodeColumn.HeaderText = "a code";
this.colorCodeColumn.Name = "aCodeColumn";
// 
// aNameColumn
// 
this.colorNameColumn.DataPropertyName = "Name";
this.colorNameColumn.HeaderText = "a name";
this.colorNameColumn.Name = "aNameColumn";

На:

// aCodeColumn
// 
this.colorCodeColumn.DataPropertyName = "ACode";
this.colorCodeColumn.HeaderText = "a code";
this.colorCodeColumn.Name = "aCodeColumn";
// 
// aNameColumn
// 
this.colorNameColumn.DataPropertyName = "AName";
this.colorNameColumn.HeaderText = "a name";
this.colorNameColumn.Name = "aNameColumn";

Разве это не должно работать?

С DataPropertyNameэто то, что привязывает к вашим свойствам, имена должны быть одинаковыми, иначе компилятор не сможет узнать, что и куда идет.

...