8

これは私が持っているコードです(非常に単純な例です):

public partial class Form1 : Form
{
    List<Person> listPersons;
    public Form1()
    {
        InitializeComponent();
        listPersons = new List<Person>();
        dataGridView1.DataSource = listPersons;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (textBox1.Text.Length > 0)
        {
            Person p = new Person();
            p.Name = textBox1.Text;
            listPersons.Add(p);
        }
    }
}

class Person
{
    public string Name { get; set; }
}

ボタンを押すと、データはリストに追加されますが、 には表示されませんDataGridView。私は何が欠けていますか?

と を に設定しようAutoGenerateColumnsVirtualModeしましたtrueが、それでも問題は解決しませんでした。

4

6 に答える 6

3

List<T> を DataGridView にバインドしようとする WinForms コードに取り組んでから、しばらく経ちました。私の記憶が正しければ、バインドするものは何でも IBindingList を実装する必要がありますが、List<T> は実装しません。私はそれについて間違っているかもしれません。

いずれにせよ、私が使用したのはBindingListViewで、これは信じられないほど高速で簡単でした。あなたはただ行う:

List<Customer> customers = GetCustomers();
BindingListView<Customer> view = new BindingListView<Customer>(customers);
dataGridView1.DataSource = view; 

これで完了です。ここ数年ソースを見ていませんが、IBindingList を実装するクラスで List<T> をラップしていると思います。

于 2012-12-24T19:17:59.200 に答える
2

しかし、BindingList<T>代わりにのみ使用するList<T>と機能します。

コード例:

    BindingList<Person> bl;
    public Form1()
    {
        InitializeComponent();
        bl = new BindingList<Person>();
        dataGridView1.DataSource = bl;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (textBox1.Text.Length > 0)
        {
            Person p = new Person();
            p.Name = textBox1.Text;
            bl.Add(p);
            textBox1.Text = "";
            textBox1.Focus();
        }
    }    

しかしDataGridView、リストにバインドした後にデータを表示する方法を理解したいと思います。

于 2012-12-24T19:42:39.587 に答える
0

datagridview をバインドするために配列を使用します。

 public partial class Form1 : Form
{

    Person[] listPersons = new Person[0];
    public Form1()
    {
        InitializeComponent();
        dataGridView1.DataSource = listPersons;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (textBox1.Text.Length > 0)
        {
            Person p = new Person();
            p.Name = textBox1.Text;
            Array.Resize<Person>(ref listPersons, listPersons.Length+1);
            listPersons[listPersons.Length-1]=p;
            dataGridView1.DataSource = listPersons;
        }

    }


}
class Person
{
    public string Name { get; set; }
}
于 2012-12-25T13:01:30.733 に答える
0

リストをデータグリッドビューに直接バインドできるとは思いません。代わりに BindingList を使用してください。

public partial class Form1 : Form
{
    BindingList<Person> lstBinding;
    public Form1()
    {
        InitializeComponent();
        lstBinding = new BindingList<Person>();
        dataGridView1.DataSource = lstBinding;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (textBox1.Text.Length > 0)
        {
            Person p = new Person();
            p.Name = textBox1.Text;
            lstBinding.Add(p);
            FillGrid();
        }
    }
    private void FillGrid()
    {
        dataGridView1.DataSource = lstBinding;
    }
}

class Person
{
    private string name;
    public string Name 
    { 
        get {return name;}
        set { name = value; } 
    }
}
于 2012-12-25T11:22:19.607 に答える
0

機能を一元化FillGridし、グリッドを更新するときに呼び出す

public Form1()
{
    InitializeComponent();
     listPersons = new List<Person>();

    FillGrid();
}

private void button1_Click(object sender, EventArgs e)
{
    if (textBox1.Text.Length > 0)
    {
        Person p = new Person();
        p.Name = textBox1.Text;
        listPersons.Add(p);

        FillGrid();
    }
}

private void FillGrid()
{
   dataGridView1.DataSource = listPersons;
}
于 2012-12-24T19:18:34.023 に答える
-1

dataGridView1.Refresh();リストに追加してから電話してみてください。

于 2012-12-24T19:14:26.260 に答える