Member 14878520 Ответов: 2

Asp.net GridView в edititemtemplate возвращает значение null, когда цикл по строкам в таблице


Привет,

Я новичок в C#, и это мой первый проект с ASP .NET GridView (или с чем-нибудь C#).
Я боролся с этой проблемой в течение нескольких дней и прочитал много статей, сообщений на форуме и ответов, а также перепробовал множество решений, но ничего не работает.

Поток раствора:

• Запрос из таблицы SQL Server на странице загружается в gvPM (grid1), в то время как gvPMgrp (grid2) не виден.
• Видны только первые 3 столбца (флажок, номер счета и имя счета), остальные не видны. Таблица очень широка, поэтому столбцы сетки группируются по номерам, добавляемым к их названию заголовка, а в RowDataBound логика включает / выключает видимость столбцов на основе суффикса заголовков
• Пользователь проверяет выбранные строки и выбирает номер группы из выпадающего списка.
• После нажатия кнопки SELECT выбранные строки отображаются в режиме редактирования в gvPMgrp (grid2), а gvPM (grid1) не отображается.
• При нажатии кнопки Обновить я выполняю цикл в foreach (строка GridViewRow в gvPMgrp.Rows), чтобы получить значения из текстовых полей, которые были отредактированы, и отправить их в качестве параметров в хранимую процедуру для обновления.

Все работает, за исключением того, что в этот момент я всегда получаю нули в ячейке. и следующая ошибка:
System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта

ASPX:
<pre lang="HTML">
<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="true" CodeFile="PMgrp.aspx.cs" Inherits="_PM" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">  
            <h1>Portfolio Monitoring</h1>
                <table>
                    <tr>
                        <th style="text-align: left; line-height: 20px;">
                            Account Number
                        </th>
                        <th style="text-align: left; line-height: 20px;">
                            Account Name
                        </th>
                    </tr>
				    <tr>
					    <td>
						    <asp:TextBox ID="txtAcctNum" Text="Account Number" label="Account Number" runat="server" Width="145px" Height="20px"></asp:TextBox>
					    </td>
					    <td>
						    <asp:TextBox ID="txtAcctName" runat="server" Text="Account Name" Width="145px" Height="20px"></asp:TextBox>					    
                        </td>
                    </tr>
                    <tr>
                        <td>
						    <asp:Button ID="btnSelect" runat="server" Text="Select Account(s)" CommandName="Edit" onclick="btnSelectClick" Width="145px" Height="20px" style="margin-right: 1px"/>
					    </td>                    
                        <td>
						    <asp:Button ID="btnDisplay" runat="server" Text="Display All Accounts" onclick="btnDisplayClick" Width="145px" Height="20px"/>
					    </td>
                    </tr>
                    <tr>
                    <td>
						<asp:Button ID="btnUpdate" runat="server" Text="Update" onclick="btnUpdateClick" Width="145px" Visible = "false" Height="20px"/>					
					</td>
                    <td>
						<asp:Button ID="btnCancel" runat="server" Text="Cancel Edit" onclick="btnCancelClick" Width="145px" Visible = "false" Height="20px"/>
					</td>
                </tr>
                <tr>
                    <td>
					    <asp:DropDownList ID="ddlGrpList" runat="server" DataSourceID="GrpsList"                             
                            DataTextField="GroupName" DataValueField="GroupNum" AutoPostBack="True" 
                            Height="20px" Width="145px" >
                            <asp:ListItem Value="GroupNum">GroupName</asp:ListItem>
                        </asp:DropDownList>
                    
                        <asp:SqlDataSource ID="GrpsList" runat="server" 
                            ConnectionString="Data Source=PARCDBX0001;Initial Catalog=TESTPIN;Integrated Security=True" 
                            ProviderName="System.Data.SqlClient" 
                            SelectCommand="EXEC uspPMgridGrps">    
                        </asp:SqlDataSource>
                        
                    </td>                    
                </tr>
			</table>       
       <div style="width: 100%; height: 700px; overflow: scroll"">
        <asp:GridView 
			ID="gvPM" 
			runat="server" 
			autogeneratecolumns="False" 
			datakeynames="Account_0"    
            onRowDataBound="gvPM_RowDataBound"          
            EnableViewState="true"

            BackColor="White" 
            BorderColor="#CCCCCC" 
			BorderStyle="Solid" 
			BorderWidth="1px" 
			CellPadding="3" 
			HorizontalAlign="Left">			
			
            <FooterStyle BackColor="White" ForeColor="#000066" />
            <HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" HorizontalAlign="Left" VerticalAlign="Top" />
           
            <RowStyle ForeColor="#000066" HorizontalAlign="Left" VerticalAlign="Top" />
            <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />			
            <SortedAscendingCellStyle BackColor="#F1F1F1" />
            <SortedAscendingHeaderStyle BackColor="#007DBB" />
            <SortedDescendingCellStyle BackColor="#CAC9C9" />
            <SortedDescendingHeaderStyle BackColor="#00547E" />
			            
            <Columns>
                <asp:templatefield HeaderText="">
                    <itemtemplate>
                        <asp:checkbox ID="cbSelect" runat="server"></asp:checkbox>
                    </itemtemplate>
                </asp:templatefield>

           		<asp:TemplateField HeaderText="Account_x">
			        <ItemTemplate>
				        <asp:Label Text='<%# Eval("Account_0")%>' runat="server" />
			        </ItemTemplate>
			        <EditItemTemplate>
				        <asp:Label ID="txtAccount_0" Text='<%# Eval("Account_0") %>' runat="server" />
			        </EditItemTemplate>
		        </asp:TemplateField>

                <asp:TemplateField HeaderText="Customer Name CFMAST_x">
			        <ItemTemplate>
				        <asp:Label Text='<%# Eval("Customer_Name_CFMAST_0")%>' runat="server" />
			        </ItemTemplate>
			        <EditItemTemplate>
				        <asp:Label ID="txtCustomer_Name_CFMAST_0" Text='<%# Eval("Customer_Name_CFMAST_0") %>' runat="server" />
			        </EditItemTemplate>
		        </asp:TemplateField>
             
            <asp:TemplateField HeaderText="Cost_to_Liquidate_0" visible="false">
					<ItemTemplate>
						<asp:TextBox Text='<%# Eval("Cost_to_Liquidate_0","{0:c}")%>' runat="server" />
					</ItemTemplate>
					<EditItemTemplate>
						<asp:TextBox ID="txtCost_to_Liquidate_0" Text='<%# Eval("Cost_to_Liquidate_0","{0:c}") %>' runat="server" />
					</EditItemTemplate>
				</asp:TemplateField>

<asp:TemplateField HeaderText="Credit_Rating_040820_0" visible="false">
					<ItemTemplate>
						<asp:TextBox Text='<%# Eval("Credit_Rating_040820_0")%>' runat="server" />
					</ItemTemplate>
					<EditItemTemplate>
						<asp:TextBox ID="txtCredit_Rating_040820_0" Text='<%# Eval("Credit_Rating_040820_0") %>' runat="server" />
					</EditItemTemplate>
				</asp:TemplateField>
				 </Columns>
        </asp:GridView>        
		   <br />
           <br />
           <br />
           <br />
           <br />
           <br />
           <asp:GridView ID="gvPMgrp"
			runat="server" 
			autogeneratecolumns="False" 
			datakeynames="Account_0"    
            onRowDataBound="gvPMgrp_RowDataBound"        
            EnableViewState="true"
            visible="false"
            BackColor="White" 
            BorderColor="#CCCCCC" 
			BorderStyle="Solid" 
			BorderWidth="1px" 
			CellPadding="3" 
			HorizontalAlign="Left">			
			
            <FooterStyle BackColor="White" ForeColor="#000066" />
            <HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" HorizontalAlign="Left" VerticalAlign="Top" />
           
            <RowStyle ForeColor="#000066" HorizontalAlign="Left" VerticalAlign="Top" />
            <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />			
            <SortedAscendingCellStyle BackColor="#F1F1F1" />
            <SortedAscendingHeaderStyle BackColor="#007DBB" />
            <SortedDescendingCellStyle BackColor="#CAC9C9" />
            <SortedDescendingHeaderStyle BackColor="#00547E" />
			            
            <Columns>
           		<asp:TemplateField HeaderText="Account_x">
			        <ItemTemplate>
				        <asp:Label Text='<%# Eval("Account_0")%>' runat="server" />
			        </ItemTemplate>
			        <EditItemTemplate>
				        <asp:Label ID="txtAccount_0" Text='<%# Eval("Account_0") %>' runat="server" />
			        </EditItemTemplate>
		        </asp:TemplateField>

                <asp:TemplateField HeaderText="Customer Name CFMAST_x">
			        <ItemTemplate>
				        <asp:Label Text='<%# Eval("Customer_Name_CFMAST_0")%>' runat="server" />
			        </ItemTemplate>
			        <EditItemTemplate>
				        <asp:Label ID="txtCustomer_Name_CFMAST_0" Text='<%# Eval("Customer_Name_CFMAST_0") %>' runat="server" />
			        </EditItemTemplate>
		        </asp:TemplateField>
             
            <asp:TemplateField HeaderText="Cost_to_Liquidate_0" visible="false">
					<ItemTemplate>
						<asp:TextBox Text='<%# Eval("Cost_to_Liquidate_0","{0:c}")%>' runat="server" />
					</ItemTemplate>
					<EditItemTemplate>
						<asp:TextBox ID="txtCost_to_Liquidate_0" Text='<%# Eval("Cost_to_Liquidate_0","{0:c}") %>' runat="server" />
					</EditItemTemplate>
				</asp:TemplateField>

<asp:TemplateField HeaderText="Credit_Rating_040820_0" visible="false">
					<ItemTemplate>
						<asp:TextBox Text='<%# Eval("Credit_Rating_040820_0")%>' runat="server" />
					</ItemTemplate>
					<EditItemTemplate>
						<asp:TextBox ID="txtCredit_Rating_040820_0" Text='<%# Eval("Credit_Rating_040820_0") %>' runat="server" />
					</EditItemTemplate>
				</asp:TemplateField>
				  </Columns>
        </asp:GridView>       
		</div>
			
    </form>
</body>
</html>



с фоновым кодом:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Configuration;

public partial class _PM : System.Web.UI.Page
{
    string conStr = @"Data Source=PARCDBX0001;Initial Catalog=TESTPIN; Integrated Security=true";   
    string grp = string.Empty;
    string acctNum = string.Empty;
    string acctName = string.Empty;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {         
            showData();
            btnSelect.Visible = true;
        }        
    }    

    private void showData()
    { 
        string qry = string.Empty;
        
        if ((acctNum.Length > 0) | (acctName.Length > 0)) //Grid for selected rows 
        {
            qry = "dbo.uspPMgetAcctData";
            SqlConnection con = new SqlConnection(conStr);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = qry;
            cmd.Parameters.Add("@acctNum", SqlDbType.Text).Value = acctNum.Trim();
            cmd.Parameters.Add("@acctName", SqlDbType.Text).Value = acctName.Trim();

            con.Open();
            gvPMgrp.EmptyDataText = "No Records Found";

            gvPM.Visible = false;
            gvPMgrp.Visible = true;
    

            gvPMgrp.DataSource = cmd.ExecuteReader();
            gvPMgrp.DataBind();           
            con.Close();            
        }
        else  //Grid for all rows
        {  
            ddlGrpList.SelectedValue = "x";
            qry = "dbo.uspPMgGetAllData";
            SqlConnection con = new SqlConnection(conStr);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = qry;

            con.Open();
            gvPM.EmptyDataText = "No Records Found";

            gvPM.Visible = true;
            gvPMgrp.Visible = false;

            gvPM.DataSource = cmd.ExecuteReader();           
            gvPM.DataBind();            
            con.Close();

            btnSelect.Visible = true;
        }
    }
     
    protected void btnUpdateClick(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(conStr);
        con.Open();
        SqlCommand cmd = new SqlCommand("dbo.[uspPMupdtAcctData]", con);
        cmd.CommandType = CommandType.StoredProcedure;

        foreach (GridViewRow row in gvPMgrp.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                string AcctNum = gvPMgrp.DataKeys[row.RowIndex].Value.ToString();
				
				cmd.Parameters.Add("@Account_0", SqlDbType.VarChar).Value = AcctNum;
				cmd.Parameters.AddWithValue("@Cost_to_Liquidate_0", (gvPMgrp.Rows[row.RowIndex].FindControl("txtCost_to_Liquidate_0"))).ToString().Trim();
				cmd.Parameters.AddWithValue("@Credit_Rating_040820_0", (gvPMgrp.Rows[row.RowIndex].FindControl("txtCredit_Rating_040820_0")));
				cmd.ExecuteNonQuery();
            }
        }
        con.Close();
        gvPMgrp.EditIndex = -1;
        showData();
    }

    protected void btnSelectClick(object sender, EventArgs e)
    {
        acctNum = "''";
        
        btnSelect.Visible = false;
        btnUpdate.Visible = true;
        btnCancel.Visible = true;
        
        grp = ddlGrpList.SelectedIndex.ToString().Trim();        

        foreach (GridViewRow row in gvPM.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                CheckBox cb = (CheckBox)(row.FindControl("cbSelect"));

                if (cb.Checked == true)
                {
                    acctNum += "','" + row.Cells[1].Controls.OfType<Label>().FirstOrDefault().Text;
                }
            }
        }

        string AcctNum  = this.txtAcctNum.Text.Trim();
        string AcctName = this.txtAcctName.Text.Trim();

        if( (!string.IsNullOrEmpty(AcctNum) ) && (AcctNum != "Account Number") )
        {
            if (AcctNum.Contains(","))
            {
                AcctNum = AcctNum.Replace(",", "','");
            }
            acctNum += "','" + AcctNum;
        }

        if (!string.IsNullOrEmpty(AcctName))
        {
            if (AcctName == "Account Name")
            {
                AcctName = "";
            }
        }

        acctName = AcctName;    
        showData();       
    }

    protected void btnDisplayClick(object sender, EventArgs e)
    {
        // Reset groups and accounts info
        grp = "x";
        txtAcctNum.Text = string.Empty;
        txtAcctName.Text = string.Empty;

        btnSelect.Visible = true;
        btnUpdate.Visible = false;
        btnCancel.Visible = false;        
        showData();
    }

    protected void btnCancelClick(object sender, EventArgs e)
    {
        grp = "x";
        btnSelect.Visible = true;
        btnUpdate.Visible = false;
        btnCancel.Visible = false;
        //gvPMgrp.Columns[0].Visible = true;
        gvPMgrp.EditIndex = -1;        
        showData();
    }
    protected void gvPM_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        for (int i = 0; i < gvPM.Columns.Count; i++)
        {
            string header = gvPM.Columns[i].HeaderText;
            string cleanHeader = string.Empty;
            string colGrp = string.Empty;

            if ((!string.IsNullOrEmpty(header)) && (header.Length > 1))
            {
                if (e.Row.RowType == DataControlRowType.Header)
                {
                    colGrp = header.Substring(header.Length - 1, 1).Trim();

                    if (colGrp == grp)
                    {
                        gvPM.Columns[i].Visible = true;
                    }
                    else if (grp == "x")
                    {
                        if (i <= 2)
                        {
                            gvPM.Columns[i].Visible = true;
                        }
                        else
                        {
                            gvPM.Columns[i].Visible = false;
                        }
                    }

                    cleanHeader = header.Substring(0, header.Length - 2).Trim().Replace("_", " ");

                    if (cleanHeader.ToLower().Contains(" date "))
                    {
                        cleanHeader += "<br/>(Date: MM/dd/yyyy)";
                    }
                    else if (cleanHeader.ToLower().Contains("cost")
                            || cleanHeader.ToLower().Contains("balance")
                            || ((cleanHeader.ToLower().Contains("value")) && (!cleanHeader.ToLower().Contains("no value")))
                            || cleanHeader.ToLower().Contains("total")
                            )
                    {
                        cleanHeader += "<br/>(Currency: $0.00)";
                    }
                    else if ( (cleanHeader.ToLower().Contains(" to ")) && (!cleanHeader.ToLower().Contains("cost")) )
                    {
                        cleanHeader += "<br/>(Percentage: 0.0%)";
                    }

                    e.Row.Cells[i].Text = cleanHeader;
                }
            }
        }
    }
    protected void gvPMgrp_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        {           
            for (int i = 0; i < gvPMgrp.Columns.Count; i++)
            {
            string header = gvPMgrp.Columns[i].HeaderText;
            string cleanHeader = string.Empty;
            string colGrp = string.Empty;

            if ((!string.IsNullOrEmpty(header)) && (header.Length > 1))
            {
                    colGrp = header.Substring(header.Length - 1, 1).Trim();

                    if (colGrp == grp)
                    {
                        gvPMgrp.Columns[i].Visible = true;
                    }
                    else if (grp == "x")
                    {
                        if (i <= 2)
                        {
                            gvPMgrp.Columns[i].Visible = true;
                        }
                        else
                        {
                            gvPMgrp.Columns[i].Visible = false;
                        }
                    }

                    cleanHeader = header.Substring(0, header.Length - 2).Trim().Replace("_", " ");

                    if (cleanHeader.ToLower().Contains(" date "))
                    {
                        cleanHeader += "<br/>(Date: MM/dd/yyyy)";
                    }
                    else if (cleanHeader.ToLower().Contains("cost")
                            || cleanHeader.ToLower().Contains("balance")
                            || ((cleanHeader.ToLower().Contains("value")) && (!cleanHeader.ToLower().Contains("no value")))
                            || cleanHeader.ToLower().Contains("total")
                            )
                    {
                        cleanHeader += "<br/>(Currency: $0.00)";
                    }
                    else if( (cleanHeader.ToLower().Contains(" to ")) && (!cleanHeader.ToLower().Contains("cost")) )
                    {
                        cleanHeader += "<br/>(Percentage: 0.0%)";
                    }

                    e.Row.Cells[i].Text = cleanHeader;
                }
            }
        }
    }
}


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

Я попытался получить viewState в таблицах данных, которые были инициированы в Page_load.
Чтобы сократить этот пост, я вставил в разметку только подмножество столбцов в обеих сетках, хотя весь код позади них вставлен.
Я также удалил все свои неудачные попытки остатков (они были прокомментированы, но это показалось бы грязным)
Что-то основное не так, но я не могу найти его в течение многих дней, я надеюсь, что кто-то может точно определить проблему, любая помощь очень ценится!

2 Ответов

Рейтинг:
2

Sweety K

https://www.c-sharpcorner.com/UploadFile/1e050f/edit-and-update-record-in-gridview-in-Asp-Net/

Попробовать это.


Рейтинг:
1

Member 14878520

Привет,

Это решается в другом форуме, который я опубликовал:
EditItemTemplate возвращает значение null, когда цикл по строкам в таблице или на форумах ASP.NET [^]

В принципе, мне не хватало ID в ItemTemplate, я искал ID EditItemTemplate. Что я пропустил, так это то, что элемент управления в этот момент не находится в режиме редактирования, поэтому я не должен смотреть в EditItemTemplate