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