C# datagridview不允许用户删除行

C# datagridview不允许用户删除行,c#,winforms,datagridview,C#,Winforms,Datagridview,我将datagridview绑定到datatable。这些列不是自动生成的,我用代码创建它们。我希望我的用户能够添加和删除一行,因此我有AllowUserToAddress=true,AllowUserToDeleteRows=true 问题是:当他们选择一行并按DEL键时,信息将被行单元格的默认值替换。争吵没有消失 这种行为是什么(为什么/发生了什么),我该如何避免 以下是我的网格创建代码: private void resetDowntimeGrid() {

我将datagridview绑定到datatable。这些列不是自动生成的,我用代码创建它们。我希望我的用户能够添加和删除一行,因此我有AllowUserToAddress=true,AllowUserToDeleteRows=true

问题是:当他们选择一行并按DEL键时,信息将被行单元格的默认值替换。争吵没有消失

这种行为是什么(为什么/发生了什么),我该如何避免

以下是我的网格创建代码:

    private void resetDowntimeGrid()
    {
        downtimeEntries = new DataTable();

        downtimeEntries.Columns.Add("Category", typeof(int));
        downtimeEntries.Columns.Add("HoursDown");
        downtimeEntries.Columns.Add("Reason");

        //deptDowntimeCategories.Select("", "ListOrder ASC");

        gridDowntime.Columns.Clear();

        DataGridViewComboBoxColumn cboCategory = new DataGridViewComboBoxColumn();
        {
            cboCategory.HeaderText = "Category";
            cboCategory.DataSource = deptDowntimeCategories;
            cboCategory.DisplayMember = "Name";
            cboCategory.ValueMember = "CategoryID";
            cboCategory.DataPropertyName = "Category";
            cboCategory.Width = Convert.ToInt16(gridDowntime.Width * 0.20);
            cboCategory.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
            cboCategory.AutoComplete = true;

            gridDowntime.Columns.Add(cboCategory);
        }

        DataGridViewTextBoxColumn txtDowntime = new DataGridViewTextBoxColumn();
        txtDowntime.HeaderText = "HoursDown";
        txtDowntime.DataPropertyName = "HoursDown";
        txtDowntime.Width = Convert.ToInt16(gridDowntime.Width * 0.15);
        gridDowntime.Columns.Add(txtDowntime);

        DataGridViewTextBoxColumn txtReason = new DataGridViewTextBoxColumn();
        txtReason.HeaderText = "Reason";
        txtReason.DataPropertyName = "Reason";
        txtReason.Width = Convert.ToInt16(gridDowntime.Width * 0.60);
        gridDowntime.Columns.Add(txtReason);

        gridDowntime.DataSource = downtimeEntries;

        lblStatus.Text = "Downtime grid reset.";
    }

下面是我使用部分代码做的一个快速示例,减去两列。我不能重复你的问题。您可能希望验证您是否实际选择了一个值,从下拉列表中单击该值,然后单击“删除”。(在本例中,我只是将一个
DataGridView
从工具箱拖到表单中,没有做其他修改。)


我创建了一个空winform,并将网格代码放入其中。不同之处在于我如何设置
DataGridView.EditMode
。我有它
=editonener
,但是如果我将它设置为
=EditOnKeystroke.

点击delete不能删除行的另一个原因是如果您将
RowHeadersVisible
属性设置为False,从而不会在最左边的列中显示
*
。有了这个解决方案,@MAW74656的解决方案对我很有效。

你能发布一些代码来说明你是如何创建/绑定数据的吗?你说用“默认值”替换行是什么意思?我尝试了您提供的代码,它的工作原理与预期相符。一个想法是行选择模式会产生意外的行为?我发现在没有全行选择的情况下删除行经常会令人困惑。@DavidHall-看起来行被清除了,但并没有消失。还有通常的新的一排,下面有*。我只想(并且期望)把*行放在左边。当我尝试它时,它的效果和预期的一样。你能提供所有的代码吗。将有一些事件处理程序干扰默认行为。可能您有自动数据库写入之类的功能?另外,您是否在一个完全空的示例表单中尝试过此功能,然后在一个正在工作的表单中尝试添加功能,直到发现问题为止。
public partial class Form1 : Form
{
       public Form1()
       {
           InitializeComponent();
       }

       private void button1_Click(object sender, EventArgs e)
       {
           DataTable myTable = new DataTable("MyTable");
           myTable.Columns.Add("CategoryID", typeof(int));
           myTable.Columns.Add("CategoryName", typeof(string));
           myTable.Rows.Add(new object[] { 1, "Small" });
           myTable.Rows.Add(new object[] { 2, "Medium" });
           myTable.Rows.Add(new object[] { 3, "Large" });

           DataGridViewComboBoxColumn cboCategory = new DataGridViewComboBoxColumn();
           cboCategory.HeaderText = "Category";
           cboCategory.DataSource = myTable;
           cboCategory.DisplayMember = "CategoryName";
           cboCategory.ValueMember = "CategoryID";
           cboCategory.DataPropertyName = "Category";
           cboCategory.Width = Convert.ToInt16(dataGridView1.Width * 0.20);
           cboCategory.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
           cboCategory.AutoComplete = true;

           dataGridView1.Columns.Add(cboCategory);

       }
}