首页 > 解决方案 > 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();
            }
        }

现在我在尝试更改行时遇到下一个错误: 应用程序“/”中的服务器错误。对象引用不指向对象的实例。说明:执行当前 Web 请求期间发生未处理的异常。检查堆栈跟踪以获取有关此错误和导致它的代码片段的更多信息。异常信息:System.NullReferenceException:对象引用未指向对象的实例。源错误:第 361 行:GridViewRow 行 = GridView1.Rows[e.RowIndex]; 第 362 行:int ID5 = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]); 第 363 行:字符串名称 = (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;
        }
    }

标签: c#asp.netgridviewweb-applications

解决方案


推荐阅读