Метод gridview_rowupdating не работает в моем проекте asp.net

У меня есть проект asp.net, в котором столбцы в GridView добавляются вручную нажатием кнопки, вот метод:

protected void addVacations_Click(object sender, EventArgs e)
    {
        using (var conn = new NpgsqlConnection(connStr))
        {
            conn.Open();
            NpgsqlCommand cmd = new NpgsqlCommand("insert into vacations(id,name,date,nodes) values(DEFAULT, @imya, @data, @primVac)", conn);

            cmd.Parameters.Add(new NpgsqlParameter("@imya", imya.Text));
            cmd.Parameters.Add(new NpgsqlParameter("@data", data.Text));
            cmd.Parameters.Add(new NpgsqlParameter("@primVac", primVac.Text));
            cmd.ExecuteNonQuery();
            Response.Redirect(Request.RawUrl);
        }

    }

У меня есть две другие кнопки, которые добавляют изменения в столбцы GridView, щелкая их. Теперь мне нужно добавить возможность менять их онлайн клиентами. Вот код GridView:

<asp:GridView ID="GridView1" runat="server" DataKeyNames="id" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" Width="1650px" AutoGenerateDeleteButton="True" OnRowDeleting="GridView1_RowDeleting" OnRowUpdating="GridView1_RowUpdating" OnRowEditing="GridView1_RowEditing" AutoGenerateEditButton="True" >

Вот метод GridView1_RowUpdating:

    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
 GridViewRow row = GridView1.Rows[e.RowIndex];
            int ID5 = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]);
            string name = (row.FindControl("name") as TextBox).Text;
            string date = (row.FindControl("date") as TextBox).Text;
            string prim = (row.FindControl("nodes") as TextBox).Text;

            string constr = ConfigurationManager.ConnectionStrings["postgresConnectionString"].ConnectionString;
            using (NpgsqlConnection cn = new NpgsqlConnection(constr))
            {
                string query = "UPDATE vacations SET name=@name,date=@date,nodes=@prim Where id=@ID5";
                NpgsqlCommand cmd = new NpgsqlCommand(query, cn);
                cmd.Parameters.Add("@name", NpgsqlDbType.Varchar).Value = name;
                cmd.Parameters.Add("@date", NpgsqlDbType.Varchar).Value = date;
                cmd.Parameters.Add("@nodes", NpgsqlDbType.Varchar).Value = prim;             
                cmd.Parameters.Add("@id", NpgsqlDbType.Integer).Value = ID5;
                cn.Open();
                cmd.ExecuteNonQuery();
            }
        }

Прямо сейчас у меня следующая ошибка при попытке изменить строки: Ошибка сервера в приложении '/'. Ссылка на объект не указывает на экземпляр объекта. Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений об этой ошибке и фрагменте кода, который ее вызвал. Информация об исключении: System.NullReferenceException: ссылка на объект не указывает на экземпляр объекта. Ошибка источника: Строка 361: строка GridViewRow = GridView1.Rows [e.RowIndex]; Строка 362: int ID5 = Convert.ToInt32 (GridView1.DataKeys [e.RowIndex] .Values ​​[0]); Строка 363: строка name = (row.FindControl ("name") as TextBox) .Text; Проблема именно в строке 363 Я думаю, проблема в моей строке, если быть точным здесь:

string name = (row.FindControl("name") as TextBox).Text;
        string date = (row.FindControl("date") as TextBox).Text;
        string prim = (row.FindControl("nodes") as TextBox).Text;

Итак, мне нужна помощь, как правильно объявить мои строки? Или что не так в моем коде.

Обновлять. Вот детали моего столбца, все три кнопки:

 protected void Button1_Click(object sender, EventArgs e)
    {
        GridView1.DataSource = null;//надо удалить текущие колонны (columns)
        GridView1.DataBind();
        for (int i = 0; GridView1.Columns.Count > i;)
        {
            GridView1.Columns.RemoveAt(i);
        }

        using (var conn = new NpgsqlConnection(connStr))
        {
            conn.Open();

            bf1.HeaderText = "Направление деятельности";
            bf1.DataField = "lineofbusiness";
            bf1.ReadOnly = true;
            bf1.SortExpression = "Napr";

            bf2.HeaderText = "Объект";
            bf2.DataField = "object";
            bf2.SortExpression = "Obj";

            bf3.HeaderText = "Мероприятия";
            bf3.DataField = "events";
            bf3.SortExpression = "Merop";

            bf4.HeaderText = "Срок";
            bf4.DataField = "deadline";
            bf4.SortExpression = "Srok";

            bf5.HeaderText = "Примечания";
            bf5.DataField = "nodes";
            bf5.SortExpression = "Prim";

            GridView1.Columns.Add(bf1);
            GridView1.Columns.Add(bf2);
            GridView1.Columns.Add(bf3);
            GridView1.Columns.Add(bf4);
            GridView1.Columns.Add(bf5);

            NpgsqlCommand cmd = new NpgsqlCommand();
            NpgsqlDataAdapter sqlDa = new NpgsqlDataAdapter("SELECT id, lineofbusiness, object, events, deadline, nodes FROM mainpage where executor = '" + (string)Session["Name"] + "'  ", conn);
            //NpgsqlDataAdapter sqlDa1 = new NpgsqlDataAdapter("SELECT lineofbusiness, object, events, deadline, nodes FROM mainpage where executor = '" + curentExec + "'  ", conn); //показ по исполнителю(раб код)
            DataTable dtbl = new DataTable();

            sqlDa.Fill(dtbl);
            GridView1.DataSource = dtbl;
            GridView1.DataBind();

            Panel2.Visible = false;
            Panel1.Visible = true;
            Panel3.Visible = false;
            //conn.Close(); //надо ли?                       
        }

    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        GridView1.DataSource = null;//надо удалить текущие колонны (columns)
        GridView1.DataBind();
        for (int i = 0; GridView1.Columns.Count > i;)
        {
            GridView1.Columns.RemoveAt(i);
        }

        using (var conn = new NpgsqlConnection(connStr))
        {
            conn.Open();

            bf1.HeaderText = "Номер";
            bf1.DataField = "id";
            bf1.ReadOnly = true;
            bf1.SortExpression = "11";

            //bf2.HeaderText = "ФИО";
            //bf2.DataField = "name";
            //bf2.SortExpression = "22";

            bf3.HeaderText = "Место";
            bf3.DataField = "place";
            bf3.SortExpression = "33";

            bf4.HeaderText = "Цель";
            bf4.DataField = "target";
            bf4.SortExpression = "44";

            bf5.HeaderText = "Срок";
            bf5.DataField = "date";
            bf5.SortExpression = "44";

            bf6.HeaderText = "Результат";
            bf6.DataField = "result";
            bf6.SortExpression = "44";

            GridView1.Columns.Add(bf1);
            GridView1.Columns.Add(bf2);
            GridView1.Columns.Add(bf3);
            GridView1.Columns.Add(bf4);
            GridView1.Columns.Add(bf5);
            GridView1.Columns.Add(bf6);

            NpgsqlCommand cmd = new NpgsqlCommand();
            //NpgsqlDataAdapter sqlDavac = new NpgsqlDataAdapter("SELECT * FROM trips", conn);
            NpgsqlDataAdapter sqlDavac = new NpgsqlDataAdapter("SELECT id, place, target, date, result FROM trips where name = '" + (string)Session["Name"] + "'  ", conn);
            DataTable dtblvac = new DataTable();

            sqlDavac.Fill(dtblvac);
            GridView1.DataSource = dtblvac;
            GridView1.DataBind();

            Panel1.Visible = false;
            Panel2.Visible = false;
            Panel3.Visible = true;
        }

    }

    protected void Button3_Click(object sender, EventArgs e)
    {
        GridView1.DataSource = null;//надо удалить текущие колонны (columns)
        GridView1.DataBind();
        for (int i = 0; GridView1.Columns.Count > i;)
        {
            GridView1.Columns.RemoveAt(i);
        }

        using (var conn = new NpgsqlConnection(connStr))
        {
            conn.Open();

            bf1.HeaderText = "Номер";
            bf1.DataField = "id";
            bf1.ReadOnly = true;
            bf1.SortExpression = "NomerVac";               

            //bf2.HeaderText = "ФИО";
            //bf2.DataField = "name";
            //bf2.SortExpression = "NameVac";

            bf3.HeaderText = "Дата";
            bf3.DataField = "date";
            bf3.SortExpression = "DataVac";

            bf4.HeaderText = "Примечания";
            bf4.DataField = "nodes";
            bf4.SortExpression = "PrimVac";

            GridView1.Columns.Add(bf1);
            GridView1.Columns.Add(bf2);
            GridView1.Columns.Add(bf3);
            GridView1.Columns.Add(bf4);

            NpgsqlCommand cmd = new NpgsqlCommand();
           //NpgsqlDataAdapter sqlDavac = new NpgsqlDataAdapter("SELECT * FROM vacations", conn);
            NpgsqlDataAdapter sqlDavac = new NpgsqlDataAdapter("SELECT id, date, nodes FROM vacations where name = '" + (string)Session["Name"] + "'  ", conn);
            DataTable dtblvac = new DataTable();

            sqlDavac.Fill(dtblvac);
            GridView1.DataSource = dtblvac;
            GridView1.DataBind();

            Panel1.Visible = false;
            Panel2.Visible = true;
            Panel3.Visible = false;
        }
    }

Можете ли вы предоставить подробную информацию о столбцах вашей разметки GridView? Я думаю, что проблема возникла из-за того, что FindControl не нашел ни одного элемента управления с указанным именем и возвращает null, а затем запускает NRE доступа к свойству Text.

Tetsuya Yamamoto 10.09.2018 10:19

@Tetsuya Yamamoto, меня добавили в раздел обновлений

badahboom 10.09.2018 10:46

Взгляните на этот учебник. Он охватывает все основы редактирования и обновления GridView.

VDWWD 10.09.2018 14:25

@Tetsuya Yamamoto Привет, мой друг! Есть ли у вас какие-либо идеи?

badahboom 11.09.2018 06:18
0
4
47
0

Другие вопросы по теме