繁体   English   中英

如何将新行添加到datagridview并在C#winform中对其进行编辑?

[英]How to add a new row to the datagridview and edit it in C# winform?

我已经将datagridview的数据源设置为数据集。 我想向此datagridview添加新行。 新行应该是可编辑的,我需要将此数据保存到数据库中。 我该如何实现?

//数据源已设置

dataGridView.DataSource = ds.Tables[0];

//添加新行

 private void button_add_Click(object sender, EventArgs e)
 {
     DataTable dt = dataGridView.DataSource as DataTable;
     dt.Rows.Add();
     dataGridView.DataSource = dt;
 }

//这会创建一个新行,但不可编辑。

PS我是C#的初学者

编辑:谁能提供一个链接/示例,让我可以不使用任何形式直接在datagridview中添加,编辑或删除?

private void button_add_Click(object sender, EventArgs e) {
    foreach (DataGridViewRow row in DataGridView1.Rows) {
        if (// condition for true) {
            row.Rows[row that should be editable].ReadOnly = true;
        } else if(// condition for false) {
            row.Rows[row that schould not be editable].ReadOnly = false;
        }
        var value = row.Cells[cellindex].Value;
    }
}

我在这里假设您的问题是,您是否希望DataGridView的其余部分为ReadOnly? 不幸的是,AllowUserToAddRows和ReadOnly这两个属性是矛盾的,如果ReadOnly为true,则AllowUserToAddRows确实会给出一个新行,但是您不能对其进行编辑。

因此,如果您真的想这样做,那么您需要有一点创意。 有多种方法,但类似的方法应该起作用。 将AllowUserToAddRows设置为true,将ReadOnly设置为false。 添加一个私有字段:

private int addedRowIndex = -1;

接下来添加几个事件:

private void dataGridView1_UserAddedRow(object sender, DataGridViewRowEventArgs e)
{
    addedRowIndex = dataGridView1.NewRowIndex - 1;
}

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
        if (!dataGridView1.Rows[e.RowIndex].IsNewRow)
        {
            if (addedRowIndex != e.RowIndex)
            {
                e.Cancel = true;
            }
        }
    }
}

这将取消所有对旧行的更改。

但是请注意,我本人从未做过这样的事情。 我使用DataGridViews的表单很多,它们总是ReadOnly true和AllowUserToAddRows false。 要添加新记录,我提供了一个按钮,用于打开模态表单,允许用户输入新记录。 然后将该记录保存到数据库中,并关闭窗体,这时刷新DataGridView。 我发现这使保存之前验证条目变得容易得多。 不仅如此,为特定数据类型提供专门的控件要容易得多,日期是一个很好的例子。 我知道人们喜欢电子表格类型“外观”的便利,但是数据库应用程序应该将数据完整性放在首位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM