Member 14185275 Ответов: 1

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


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

Что я уже пробовал:

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();              
}


хранимая процедура:

  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


ДАЛМАТИНЕЦ:

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();
    }



БАЛАНС:

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

1 Ответов

Рейтинг:
12

Juan Medina

Проблема, по-видимому, заключается в идентификаторе, который вы передаете в SQL.

С тех пор как вы создали новую запись, идентификатор еще не изменился, поэтому в вашем случае вам нужно установить

HiddenField1.Value = ""
прежде чем вызвать " btn_savprior_Click ()", чтобы перейти к этому "если" (кроме того, я бы изменил предупреждение как "созданное" вместо "сохраненное"):
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 Created Successfully')</script>");

    }

Я вижу, что вы устанавливаете значение для первой функции, но если значение новое, то столбец "P_ID" получает другое число (возможно), поэтому значение никогда не будет равно нулю.

Пожалуйста, попробуйте вычислить общую сумму и сохранить ее в переменной что-то вроде:
private int CountRows = 0

Затем вы вызываете свой набор данных и присваиваете значение переменной
...
CountRows = GV_PRIOR.Rous.Count;
...


После этого вы можете изменить свою функцию следующим образом:
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)
    {
        if (Convert.ToInt32(dr["P_ID"].ToString()) > CountRows)
        {
                HiddenField1.Value = "";
        }
        else
        {
                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 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)
    {
        if (Convert.ToInt32(dr["P_ID"].ToString()) > CountRows)
        {
            HiddenField1.Value = "";
        }
        else
        {
            HiddenField1.Value = dr["P_ID"].ToString();
        }
        tb_prioname.Text = dr["P_NAME"].ToString();
        chk_actprior.Checked = dr["P_ACTIVE"].ToString() == "Y";
    }
    if (HiddenField1.Value == "")
    {
        btn_savprior.Text = "CREATE";
    }
    else
    {
        btn_savprior.Text = "UPDATE";
    }
}


Member 14185275

Большое спасибо Вам за ответ, и решение отлично работает.
спасибо тебе