我有一个简单的C#Windows窗体应用程序,它应该显示一个DataGridView。作为DataBinding,我使用了一个Object(选择了一个名为Car的类),这就是它的样子:
class Car
{
public string color { get; set ; }
public int maxspeed { get; set; }
public Car (string color, int maxspeed) {
this.color = color;
this.maxspeed = maxspeed;
}
}
但是,当我将DataGridView属性AllowUserToAddRows
设置为true
时,仍有一些*允许我添加行。
有人建议将carBindingSource.AllowAdd
设置为true
,但是,当我这样做时,我会得到MissingMethodException
,表示无法找到我的构造函数。
答案 0 :(得分:12)
你的Car类需要一个无参数构造函数,你的数据源需要像BindingList
将Car类更改为:
class Car
{
public string color { get; set ; }
public int maxspeed { get; set; }
public Car() {
}
public Car (string color, int maxspeed) {
this.color = color;
this.maxspeed = maxspeed;
}
}
然后绑定这样的东西:
BindingList<Car> carList = new BindingList<Car>();
dataGridView1.DataSource = carList;
您也可以使用BindingSource,但不必使用BindingSource,但BindingSource提供了一些有时可能需要的额外功能。
如果由于某种原因你绝对无法添加无参数构造函数,那么你可以处理绑定源的添加新事件并调用Car参数化构造函数:
设置绑定:
BindingList<Car> carList = new BindingList<Car>();
BindingSource bs = new BindingSource();
bs.DataSource = carList;
bs.AddingNew +=
new AddingNewEventHandler(bindingSource_AddingNew);
bs.AllowNew = true;
dataGridView1.DataSource = bs;
处理程序代码:
void bindingSource_AddingNew(object sender, AddingNewEventArgs e)
{
e.NewObject = new Car("",0);
}
答案 1 :(得分:2)
您需要添加AddingNew事件处理程序:
public partial class Form1 : Form
{
private BindingSource carBindingSource = new BindingSource();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = carBindingSource;
this.carBindingSource.AddingNew +=
new AddingNewEventHandler(carBindingSource_AddingNew);
carBindingSource.AllowNew = true;
}
void carBindingSource_AddingNew(object sender, AddingNewEventArgs e)
{
e.NewObject = new Car();
}
}
答案 2 :(得分:1)
我最近发现,如果您使用IBindingList
实现自己的绑定列表,除了true
之外,您必须在SupportsChangeNotification
中返回AllowNew
。
DataGridView.AllowUserToAddRows
的{{3}}文章仅指定以下注释:
如果DataGridView绑定到数据,则如果此属性和数据源的IBindingList.AllowNew属性都设置为true,则允许用户添加行。