C# - DataGridView无法添加行?

Mec*_*MK1 8 c# datagridview

我有一个简单的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,当我在DataGridView属性设置AllowUserToAddRowstrue,仍然有不小的*这让我添加行.

然而,有人建议设置carBindingSource.AllowAddtrue,当我这样做时,我得到一个MissingMethodException说我的构造函数找不到.

Dav*_*all 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后绑定这样的东西:

BindingList<Car> carList = new BindingList<Car>();

dataGridView1.DataSource = carList;
Run Code Online (Sandbox Code Playgroud)

您也可以使用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;
Run Code Online (Sandbox Code Playgroud)

和处理程序代码:

void bindingSource_AddingNew(object sender, AddingNewEventArgs e)
{
    e.NewObject = new Car("",0);
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*vić 5

您需要添加 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();
    }
}
Run Code Online (Sandbox Code Playgroud)