2015-04-23 4 views
0

У меня есть GridView с двумя столбцами. Первый показывает дату, а второй - год даты в первой колонке. Пока все работает хорошо, но когда я меняю страницу, сеть выходит из строя с сообщением: «Ссылка на объект не установлена ​​в экземпляр объекта».Ошибка при подкачке в GridView

Это мой код:

Test.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="qq_site_Test" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>TEST</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:GridView ID="GridView1" runat="server" AllowPaging="True" PageSize="5" 
      AllowSorting="True" AutoGenerateColumns="False" 
      EnableModelValidation="True" onrowcreated="GridView1_RowCreated" 
      onpageindexchanged="GridView1_PageIndexChanged" 
      onpageindexchanging="GridView1_PageIndexChanging"> 
      <Columns> 
       <asp:CommandField ShowSelectButton="True" /> 
       <asp:CommandField ShowDeleteButton="True" /> 
       <asp:BoundField DataField="creationDate" HeaderText="creationDate" SortExpression="creationDate" /> 
       <asp:TemplateField HeaderText="Year"> 
        <ItemTemplate> 
         <asp:TextBox ID="TextBox1" runat="server" ReadOnly="True"></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField>     
      </Columns> 
     </asp:GridView> 
    </div> 
    </form> 
</body> 
</html> 

Test.aspx.cs

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data.Odbc; 
using System.Data; 

public partial class qq_site_Test : System.Web.UI.Page 
{ 
    static DataSet ds; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      String connectionString = "DSN=kitchenmaster.es.qq-site;"; 
      String sqlQuery = "SELECT * FROM tblSystems WHERE ID < 100"; 

      ds = new DataSet(); 

      OdbcConnection connection = new OdbcConnection(connectionString); 
      OdbcCommand command = new OdbcCommand(sqlQuery, connection); 
      OdbcDataAdapter adapter = new OdbcDataAdapter(command); 

      try 
      { 
       adapter.Fill(ds); 
       GridView1.DataSource = ds; 
       GridView1.DataBind(); 
      } 
      catch (System.Exception ex) 
      { 
       Response.Write(ex.Message); 
      } 
      finally 
      { 
       if (connection.State == ConnectionState.Open) 
        connection.Close(); 
      } 
     } 
    } 

    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      try 
      { 
       DateTime dt = (DateTime)DataBinder.Eval(e.Row.DataItem, "creationDate"); 
       e.Row.Cells[GetColumnByID("Year")].Text = dt.Year.ToString(); 
      } 
      catch (System.Exception ex) 
      { 
       Response.Write(ex.Message);    
      } 
     } 
    } 

    protected int GetColumnByID(String columnName) 
    { 
     foreach (DataControlField column in GridView1.Columns) 
     { 
      if (column.HeaderText == columnName) 
       return GridView1.Columns.IndexOf(column); 
     } 

     return -1; 
    } 

    protected void GridView1_PageIndexChanged(object sender, EventArgs e) 
    { 
     GridView1.SelectedIndex = -1; 
    } 

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     try 
     { 
      if (e.NewPageIndex != -1) 
      { 
       GridView1.PageIndex = e.NewPageIndex; 
       GridView1.DataSource = ds; 
       GridView1.DataBind(); 
      } 
     } 
     catch (System.Exception ex) 
     { 
      Response.Write(ex.Message); 
     } 
    } 
} 

Можете ли вы мне помочь?

+3

Какая строка кода, в которой вы получаете вышеуказанное исключение? –

+0

Исключение происходит в случае GridView1_RowCreated() –

+0

, который * строка * и что является исключением? – naveen

ответ

1

Эта строка кода

GridView1.DataSource = ds; 

, вероятно, где вы получаете сообщение об ошибке.

Когда вызывается событие GridView1_PageIndexChanging, вы еще не установили значение для ds. Единственная часть вашего кода, которая делает это, находится в событии Page_Load и только тогда, когда это не обратная передача.

0

Если я проверяю значение e.Row.DataItem в случае GridView1_RowCreated(), ошибка не возникает, но я не знаю, правильно ли это делать. Новая версия этого события:

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      try 
      { 
       if (e.Row.DataItem != null) 
       { 
        DateTime dt = (DateTime)DataBinder.Eval(e.Row.DataItem, "creationDate"); 
        e.Row.Cells[GetColumnByID("Year")].Text = dt.Year.ToString(); 
       } 
      } 
      catch (System.Exception ex) 
      { 
       Response.Write("** " + ex.Message); 
      } 
     } 
    } 
+0

Несомненно, вы избегаете ошибки, но действительно ли ваша разбивка на страницы работает? – rikitikitik

0

Пожалуйста, проверьте «DS» объект внутри в PageIndexChanging случае. Сначала заполните набор данных и привяжите их.

Смежные вопросы