Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将DataGridView绑定到列表<;T>;不显示数据_C#_Winforms_List_Generics_Datasource - Fatal编程技术网

C# 将DataGridView绑定到列表<;T>;不显示数据

C# 将DataGridView绑定到列表<;T>;不显示数据,c#,winforms,list,generics,datasource,C#,Winforms,List,Generics,Datasource,这是我的代码(这是一个非常简单的示例): 公共部分类表单1:表单 { 列出名单人员; 公共表格1() { 初始化组件(); listPersons=新列表(); dataGridView1.DataSource=listPersons; } 私有无效按钮1\u单击(对象发送者,事件参数e) { 如果(textBox1.Text.Length>0) { 人员p=新人员(); p、 Name=textBox1.Text; 增加(p); } } } 班主任 { 公共字符串名称{get;set;} }

这是我的代码(这是一个非常简单的示例):

公共部分类表单1:表单
{
列出名单人员;
公共表格1()
{
初始化组件();
listPersons=新列表();
dataGridView1.DataSource=listPersons;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
如果(textBox1.Text.Length>0)
{
人员p=新人员();
p、 Name=textBox1.Text;
增加(p);
}
}
}
班主任
{
公共字符串名称{get;set;}
}
按下按钮时,数据将添加到列表中,但它不会显示在
DataGridView
中。我错过了什么


我已尝试将
AutoGenerateColumns
VirtualMode
设置为
true
,但这也没有解决问题。

尝试调用
dataGridView1.Refresh()添加到列表后。

已经有一段时间了,自从使用试图将列表绑定到DataGridView的WinForms代码以来,我已经切换了作业。如果我没记错的话,无论绑定什么,都需要实现IBindingList,而哪个列表不需要。我可能错了

在任何情况下,我使用的是,这是难以置信的快速和简单。你只要做:

List<Customer> customers = GetCustomers();
BindingListView<Customer> view = new BindingListView<Customer>(customers);
dataGridView1.DataSource = view; 
List customers=GetCustomers();
BindingListView视图=新的BindingListView(客户);
dataGridView1.DataSource=view;

你完成了。我已经有几年没有看过源代码了,但我相信它用一个实现IBindingList的类包装了列表。

集中您的
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;
}
public Form1()
{
初始化组件();
listPersons=新列表();
FillGrid();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
如果(textBox1.Text.Length>0)
{
人员p=新人员();
p、 Name=textBox1.Text;
增加(p);
FillGrid();
}
}
私有void FillGrid()
{
dataGridView1.DataSource=listPersons;
}

但是如果我只使用
bindingslist
而不是
List
它确实有效

示例代码:

    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();
        }
    }    
bindinglistbl;
公共表格1()
{
初始化组件();
bl=新绑定列表();
dataGridView1.DataSource=bl;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
如果(textBox1.Text.Length>0)
{
人员p=新人员();
p、 Name=textBox1.Text;
bl.Add(p);
textBox1.Text=“”;
textBox1.Focus();
}
}    

但在将数据与列表绑定后,我仍然想知道如何在
DataGridView
中显示数据。

我认为您不能直接将列表绑定到DataGridView。 而是使用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; } 
    }
}
公共部分类表单1:表单
{
绑定列表和绑定;
公共表格1()
{
初始化组件();
lstBinding=新的BindingList();
dataGridView1.DataSource=lstBinding;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
如果(textBox1.Text.Length>0)
{
人员p=新人员();
p、 Name=textBox1.Text;
添加(p);
FillGrid();
}
}
私有void FillGrid()
{
dataGridView1.DataSource=lstBinding;
}
}
班主任
{
私有字符串名称;
公共字符串名
{ 
获取{返回名称;}
设置{name=value;}
}
}

使用数组绑定datagridview ie

 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; }
}
公共部分类表单1:表单
{
人员[]列表人员=新人员[0];
公共表格1()
{
初始化组件();
dataGridView1.DataSource=listPersons;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
如果(textBox1.Text.Length>0)
{
人员p=新人员();
p、 Name=textBox1.Text;
调整数组大小(参考listPersons,listPersons.Length+1);
listPersons[listPersons.Length-1]=p;
dataGridView1.DataSource=listPersons;
}
}
}
班主任
{
公共字符串名称{get;set;}
}

+1 DataGridView的文档中说,实现IList的数据源可以工作,但首选IBindingSource,因为它会自动处理许多绑定问题,大概是这样的问题。@jam40jeff:是的,我必须查找它。如果要以任何方式对列表进行排序,IBindingList似乎是必需的。很抱歉,VS 2008及更早版本中没有BindingListView类。将尝试对BindingList类执行相同的操作-请告知您否,使用BindingList不起作用。它仍然没有更新dataGridView(我重复一遍,我没有任何BndingListView类)。@MitjaBonca:BindingListView不是内置的。这是一个第三方库(检查链接)。所以每次我都会设置数据源?不,这也不行。
 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; }
}