Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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#VB.FORM向gridview添加行_C#_Sql - Fatal编程技术网

从按钮c#VB.FORM向gridview添加行

从按钮c#VB.FORM向gridview添加行,c#,sql,C#,Sql,早上好,我正在尝试在c#vb.net和sql server中向gridview表单添加1个按钮1新行,但是我找不到使用按钮向gridview添加1新行的函数 到目前为止,我只向gridview显示了记录,这是我显示数据的代码 private void txtcod_TextChanged(object sender, EventArgs e) { if (txtcod.Text == "") { }

早上好,我正在尝试在c#vb.net和sql server中向gridview表单添加1个按钮1新行,但是我找不到使用按钮向gridview添加1新行的函数

到目前为止,我只向gridview显示了记录,这是我显示数据的代码

 private void txtcod_TextChanged(object sender, EventArgs e)
    {
        if (txtcod.Text == "")
        {



        }
        else {

            this.dgvcontactos.DataSource = negCli.DatosContacto(MODULOS.Globales.Base, txtcod.Text);
        
        }
    }

这是我的数据层,我有一个调用存储过程的函数

公共数据表Contactos\u ClieProvs(字符串basesita,字符串codClie)
{
DataTable dt=新的DataTable();
尝试
{
SqlConnection cnn=newsqlconnection(conexion.CargarBase(basesita));
SqlCommand cmd=newsqlcommand(“execute CONTACTOS@tipo=13,@IdClieProv='”+codClie+'”,cnn);
//cmd.CommandTimeout=0;
SqlDataAdapter da=新的SqlDataAdapter(cmd);
尝试
{
如果(cnn.State==ConnectionState.Closed)
{
cnn.Open();
}
其他的
{
cnn.Close();
cnn.Open();
}
da.填充(dt);
}
catch(SqlException ex){throw ex;}
最后
{
cnn.Close();
}
}
catch(SqlException ex1){throw ex1;}
返回dt;

}
您可以向数据表中添加一行,它将显示在网格上

<>但是考虑使用BDIN源是很好的,在这里您可以按事件设置新行的初始化。

System.Windows.Forms.BindingSource bs = new System.Windows.Forms.BindingSource();
private void txtcod_TextChanged(object sender, EventArgs e)
{
    if ("" == "") return;

    var dt = negCli.DatosContacto(MODULOS.Globales.Base, txtcod.Text);
    bs.DataSource = dt;
    bs.AddingNew +=bs_AddingNew;
    dt.RowDeleting +=dt_RowDeleting;
    this.dgvcontactos.DataSource = bs;
}

void dt_RowDeleting(object sender, DataRowChangeEventArgs e)
{
    // Delete from db
}

void bs_AddingNew(object sender, System.ComponentModel.AddingNewEventArgs e)
{
    // init new row columns with init values in e.NewObject;
}

private void btnAddNew(object sender, EventArgs e) {
    bs.AddNew();
}

private void btnSave(object sender, EventArgs e) {
    var dt = bs.DataSource as DataTable;
    foreach(DataRow r in dt.GetChanges().Rows) {
        if(r.RowState == DataRowState.Added) {
            // Save to db
        }
        if(r.RowState == DataRowState.Modified) {
            // Save changes
        }
    }
    dt.AcceptChanges();
}

目前尚不清楚网格是如何填充数据的。它有数据源吗?如果有,则可以将该行添加到数据源。或者可能将网格
allowUserToAddress
设置为true,这将在网格底部留下一个额外的“空”行,用户无需单击按钮即可在其中添加行。此外,是否有某些原因导致您没有在按钮的单击事件中发布代码?只是一个想法。我理解你的观点如果是这样的话,让gridview保留AllowUserToAddress,就像网格完成后一样,保存到数据库中,有什么想法吗?当用户添加一行时,网格中有可以订阅的事件。您可以在用户离开新行后“保存”新数据。如果新行中需要进行数据验证,则可能会打开一个弹出表单来添加新数据,然后代码可以在验证数据后添加该行。当用户在单元格中输入文本时,您当然可以在网格本身中进行验证,但是,如果存在大量验证,我相信添加数据的弹出表单将使验证更加容易。使用本地DataTable变量:
DataTable dt=negCli.DatosContacto(MODULOS.Globales.Base,txtcod.text)将网格设置为该变量。现在您可以将一行添加到
dt
,它将自动显示在网格中。旁注:SqlDataAdapter可以根据需要打开和关闭连接,因此您可以删除
Try{}
块中
da.Fill(dt)上方的所有代码行和
最后{}
块。如果(r.RowState==DataRowState.Modified){//save Changes}要修改所选行,则在代码中使用{}
块作为一次性对象时,在添加新行时效果非常好,直到“保存”按钮出现之前,如果此查询(r.RowState==DataRowState.Modified){//save Changes}是真的