Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在填充当前行之前,是否阻止新行出现在DataGridView中?_C#_Winforms_Datagridview_Datagridviewrow - Fatal编程技术网

C# 在填充当前行之前,是否阻止新行出现在DataGridView中?

C# 在填充当前行之前,是否阻止新行出现在DataGridView中?,c#,winforms,datagridview,datagridviewrow,C#,Winforms,Datagridview,Datagridviewrow,我在C#3.5中的WinForm应用程序中有一个DataGridView AllowUserToAddNewRow属性设置为true。当用户在DataGridView中键入任何文本时,另一个新行将自动添加到DataGridView。我不希望添加这一新行,直到对当前行执行了一些检查,并在其中填写了所有必要的信息 示例:我有一个带有空行的DataGridView: 当我开始键入时,会添加新行,这太早了: 我想要的是,只有在用户输入数量后才能添加新行: 我认为在事件单元格中,单击可以检查您所在的列

我在C#3.5中的WinForm应用程序中有一个DataGridView

AllowUserToAddNewRow
属性设置为true。当用户在DataGridView中键入任何文本时,另一个新行将自动添加到DataGridView。我不希望添加这一新行,直到对当前行执行了一些检查,并在其中填写了所有必要的信息

示例:我有一个带有空行的DataGridView:

当我开始键入时,会添加新行,这太早了:

我想要的是,只有在用户输入数量后才能添加新行:

我认为在事件单元格中,单击可以检查您所在的列,然后添加新行,例如:
DataGridView1.Rows.add()
设置AllowUserToAddNewRow=false 现在,首先在数据源中添加一个空行,例如,如果要将DataGridView绑定到名为DT的DataTable,那么就在前面

dataGridView1.DataSource = DT;
做点像

 DT.Rows.Add(DT.NewRow());
这是为了最初有一个空行,以便可以输入第一条记录。 然后处理事件dataGridView1.CellEndEdit,在该事件中编写如下内容:

void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 1)//The index of your Quantity Column
        {
            int qty = (int)DT.Rows[e.RowIndex][e.ColumnIndex];
            if (qty > 0)//Your logic if required
            {
                DT.Rows.Add(DT.NewRow());                    
            }
        }
    }

这就是它的实现方式

a) 您可以使用检查RowLeave事件中当前行的内容

String.IsNullOrWhiteSpace(GridPGLog.Rows[e.RowIndex].Cells[0].value.toString())
using (or) Cells[0] || cells[1] || cell[2] || ..
如果发现任何错误,请将焦点设置为错误单元格,并强制用户输入数据

DataGridViewRow rowToSelect = this.dgvJobList.CurrentRow;
rowToSelect.Selected = true;
rowToSelect.Cells[0].Selected = true;
this.dgvJobList.CurrentCell = rowToSelect.Cells[0];
b) 或者您可以放置一个保存按钮并使用foreach循环检查所有新添加的行

我知道这是旧的。 最简单的方法是,从设计视图中取消选中“启用添加”


基本上,这是一个简单的游戏,包含一些事件,并启用/禁用AllowUserToAddressRow属性:

public Form1()
        {
            InitializeComponent();
            //creating a test DataTable and adding an empty row
            DataTable dt = new DataTable();
            dt.Columns.Add("Column1");
            dt.Columns.Add("Column2");
            dt.Rows.Add(dt.NewRow());

            //binding to the gridview
            dataGridView1.DataSource = dt;

            //Set  the property AllowUserToAddRows to false will prevent a new empty row
            dataGridView1.AllowUserToAddRows = false;
        }
现在事件。。。 当单元格识别编辑时,它将触发一个名为CellBeginEdit的事件。在编辑模式下,将AllowUserToAddress设置为false

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    dataGridView1.AllowUserToAddRows = false;
}
当单元格识别到编辑结束时,它将触发一个名为CellEndEdit的事件。当它结束编辑模式时,检查您的条件。根据结果集,AllowUserToAddress设置为true,而不是保留为false

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    //instead of MessageBox there could be as well your check conditions
    if (MessageBox.Show("Cell edit finished, add a new row?", "Add new row?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        dataGridView1.AllowUserToAddRows = true;
    else dataGridView1.AllowUserToAddRows = false;
}

不需要用户通过鼠标进行导航,可能是他们通过键盘进行界面您上面提到的这一点可以在RowValidating事件上通过e轻松实现。Cancel=true,但我希望如果当前行未填充,则不应添加新行。如果您执行它,用户将无法将焦点放在行外以添加新行,但这不是我正在寻找的答案我只想取消行添加抱歉无法理解您…取消行添加是什么意思?如果您的意思是不应该在DataGrid中添加新行,那么只需设置AllowUserToAddNewRow=false,正如我在上面第一行中提到的,我希望行应该添加条件。我认为这就是我们在这里试图实现的目标。这样做的想法是,行永远不会自动添加(通过将AllowUserToAddNewRow设置为False来实现这一点,我感觉您忽略了这一点)。一旦将此属性设置为false,新行将永远不会添加,那么如何添加新行呢?您向基础数据源添加新行,并“有条件地”这样做,即当我在上面的CellEndEdit ebent处理程序代码中显示Quaty大于0时。yeh!我已经实现了这个解决方案,但是在这个解决方案中,我们没有任何新行,所以我们无法识别哪一行是新的。但是,尽管我已经用这个解决方案解决了我的问题,谢谢。这是解决不需要时出现的额外空行的最简单方法。