При вставке новой записи в базу данных старая запись обновляется в виде сетки.

Представление сетки обновляет старую запись, когда я пытаюсь добавить новую запись.

В виде сетки у меня есть опция редактирования. Если я нажму «Изменить», конкретная строка будет редактировать экран, заполнять текстовые поля и обновляться, как и ожидалось. При нажатии на кнопку «Добавить новую запись» в виде сетки, как и ожидалось, будет добавлен экран с пустыми текстовыми полями, но если я добавлю новую запись, она обновит предыдущую запись, которая была отредактирована.

protected void GV_PRIOR_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
    int pid = Convert.ToInt32(GV_PRIOR.DataKeys[e.NewSelectedIndex].Value);
    DataTable dt = bll.editprior(pid);
    foreach (DataRow dr in dt.Rows)
    {
        HiddenField1.Value = dr["P_ID"].ToString();
        tb_prioname.Text = dr["P_NAME"].ToString();
        chk_actprior.Checked = dr["P_ACTIVE"].ToString() == "Y";
    }
    btn_savprior.Text = "UPDATE";                
}

protected void btn_savprior_Click(object sender, EventArgs e)
{
    if (HiddenField1.Value == "")
    {
        bll.savprior(0, tb_prioname.Text, Convert.ToBoolean(chk_actprior.Checked));
        Response.Write("<script>alert('Priority Saved Successfully')</script>");

    }
    else
    {
        bll.savprior(Convert.ToInt16(HiddenField1.Value), tb_prioname.Text, Convert.ToBoolean(chk_actprior.Checked));
        Response.Write("<script>alert('Priority Updated Successfully')</script>");
    }
    bindgrid();              
}

Если я нажму кнопку «Добавить новую запись», после заполнения текстовых полей она должна добавить новую запись, но она обновляет старую запись, которая была отредактирована непосредственно перед добавлением новой записи.

Stored Procedure:

    ALTER PROC [dbo].[SAVEPRIOR]
  @P_ID int,
  @P_NAME varchar(20),
  @P_ACTIVE char(1)
  AS
  BEGIN
  IF(@P_ID=0)     
  BEGIN
  INSERT INTO PRIORITY(P_NAME) VALUES (@P_NAME)
  END   
  ELSE  
  BEGIN
  UPDATE PRIORITY SET P_NAME=@P_NAME,P_ACTIVE=@P_ACTIVE WHERE P_ID=@P_ID
  END
  END

DAL:

public void savePRIOR(int id, string priorname, bool actv )
    {
        SqlCommand cmd = new SqlCommand("SAVEPRIOR", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@P_ID", id);
        cmd.Parameters.AddWithValue("@P_NAME", priorname);
        cmd.Parameters.AddWithValue("@P_ACTIVE", (actv) ? "Y" : "N");            
        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
    }

BAL:

 public void savprior(int id, string priorname, bool actv )
    {
        dll.savePRIOR(id, priorname, actv);
    } 

person Ganesh    schedule 29.04.2019    source источник
comment
Возможно ли, что объект bll где-то хранит идентификатор записи, которую вы редактируете, и использует его для обновления записи вместо ее создания?   -  person Marco    schedule 29.04.2019
comment
Если я редактирую запись и обновляю ее, она правильно обновляется и возвращается к сетке и выделяет эту отредактированную запись, но теперь, если я пытаюсь добавить новую запись, она обновляет выделенную запись.   -  person Ganesh    schedule 29.04.2019
comment
Не могли бы вы проверить, если после сохранения записи вызывается GV_PRIOR_SelectedIndexChanging? Или любой другой метод, который установит HiddenField1.Value = dr["P_ID"].ToString(); или что-то в этом роде. Я предполагаю, что это приводит к тому, что ваша добавленная запись берет этот идентификатор и обновляет его.   -  person Marco    schedule 29.04.2019


Ответы (1)


Попробуйте очистить HiddenField1.Value=""; перед сеткой();

person Abhijit Poojari    schedule 29.04.2019
comment
Эй, спасибо, abhijit.. это сработало после очистки значения скрытого поля. Большое спасибо, ребята. - person Ganesh; 29.04.2019