2013-04-15 3 views
0

Я пытаюсь переместить конкретные GridView данные в файл первенствовать, но я получаю сообщение об ошибке, как object reference not set to the instance of an objectконкретные GridView перемещать данные в Excel файл

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns = "false" Font-Names = "Arial" 
Font-Size = "11pt" AlternatingRowStyle-BackColor = "#C2D69B" 
HeaderStyle-BackColor = "green"> 
<Columns> 
<asp:TemplateField> 
<HeaderTemplate> 
<asp:CheckBox ID="Chckcol0" runat="server" Checked="true"/> 
<asp:Label ID="lbl_catid" runat="server" Text=" CategoryID"></asp:Label> 
</HeaderTemplate> 
<ItemTemplate> 
<asp:Label ID="lbl_catid" runat="server" Text='<%# Eval("cat_id")%>'></asp:Label> 
</ItemTemplate> 
</asp:TemplateField> 
<asp:TemplateField> 
<HeaderTemplate> 
<asp:CheckBox ID="Chckcol1" runat="server" Checked="true"/> 
<asp:Label ID="lbl_catname" runat="server" Text="category Name"></asp:Label> 
</HeaderTemplate> 
<ItemTemplate> 
<asp:Label ID="lbl_categoryname" runat="server" Text='<%# Eval("categoryname")%>'>  </asp:Label> 
</ItemTemplate> 
</asp:TemplateField> 
<asp:TemplateField> 
<HeaderTemplate> 
<asp:CheckBox ID="Chckcol2" runat="server" Checked="true"/> 
<asp:Label ID="description" runat="server" Text="description"></asp:Label> 
</HeaderTemplate> 
<ItemTemplate> 
<asp:Label ID="lbl_description" runat="server" Text='<%# Eval("description")%>'> </asp:Label> 
</ItemTemplate> 
</asp:TemplateField> 
</Columns> 
</asp:GridView> 

И мой код позади:

public partial class _Default : System.Web.UI.Page 
{ 
MySqlConnection con = new MySqlConnection("Data Source=localhost;Database=mylibrary_db;User ID=root;Password=MyLuck2010"); 
protected void Page_Load(object sender, EventArgs e) 
{ 

    if (!IsPostBack) 
    { 
     fillgrid(); 
    } 
} 
protected void fillgrid() 
{ 
    MySqlDataAdapter da = new MySqlDataAdapter("select cat_id,categoryname,description from library_category", con); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    GridView1.DataSource = ds; 
    GridView1.DataBind(); 
} 
protected void getcheckedgridview() 
{ 
    CheckBox chkCol0 = (CheckBox)GridView1.HeaderRow.Cells[0].FindControl("chkCol0"); 
    CheckBox chkCol1 = (CheckBox)GridView1.HeaderRow.Cells[0].FindControl("chkCol1"); 
    CheckBox chkCol2 = (CheckBox)GridView1.HeaderRow.Cells[0].FindControl("chkCol2"); 
    ArrayList arr; 
    if (ViewState["States"] == null) 
    { 
     arr = new ArrayList(); 
    } 
    else 
    { 
     arr = (ArrayList)ViewState["States"]; 
    } 
    arr.Add(chkCol0.Checked); 
    arr.Add(chkCol1.Checked); 
    arr.Add(chkCol2.Checked); 
    ViewState["States"] = arr; 
} 
protected void btnExportExcel_Click(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.Buffer = true; 
    Response.AddHeader("content-disposition","attachment;filename=GridViewExport.xls"); 
    Response.Charset = ""; 
    Response.ContentType = "application/vnd.ms-excel"; 
    StringWriter sw = new StringWriter(); 
    HtmlTextWriter hw = new HtmlTextWriter(sw); 
    GridView1.AllowPaging = false; 
    GridView1.DataBind(); 
    GridView1.HeaderRow.Style.Add("background-color", "#FFFFFF"); 
    GridView1.HeaderRow.Cells[0].Style.Add("background-color", "green"); 
    GridView1.HeaderRow.Cells[1].Style.Add("background-color", "green"); 
    GridView1.HeaderRow.Cells[2].Style.Add("background-color", "green"); 
    ArrayList arr = (ArrayList)ViewState["States"]; 
    GridView1.HeaderRow.Cells[0].Visible = Convert.ToBoolean(arr[0]); 
    GridView1.HeaderRow.Cells[1].Visible = Convert.ToBoolean(arr[1]); 
    GridView1.HeaderRow.Cells[2].Visible = Convert.ToBoolean(arr[2]); 
    GridView1.HeaderRow.Cells[0].FindControl("chkCol0").Visible = false; 
    GridView1.HeaderRow.Cells[1].FindControl("chkCol1").Visible = false; 
    GridView1.HeaderRow.Cells[2].FindControl("chkCol2").Visible = false; 

    for (int i = 0; i < GridView1.Rows.Count; i++) 
    { 

     GridViewRow row = GridView1.Rows[i]; 
     row.Cells[0].Visible = Convert.ToBoolean(arr[0]); 
     row.Cells[1].Visible = Convert.ToBoolean(arr[1]); 
     row.Cells[2].Visible = Convert.ToBoolean(arr[2]); 
     row.BackColor = System.Drawing.Color.White; 
     row.Attributes.Add("class", "textmode"); 

     if (i % 2 != 0) 
     { 
      row.Cells[0].Style.Add("background-color", "#C2D69B"); 
      row.Cells[1].Style.Add("background-color", "#C2D69B"); 
      row.Cells[2].Style.Add("background-color", "#C2D69B"); 
     } 

    } 

    GridView1.RenderControl(hw); 
    string style = @"<style> .textmode { mso-number-format:\@; } </style>"; 
    Response.Write(style); 
    Response.Output.Write(sw.ToString()); 
    Response.End(); 
} 

}

+0

Я просто получаю сообщение об ошибке, поскольку ссылка объекта не установлена ​​на экземпляр объекта, когда я нажимаю кнопку – Ashish

+0

yes, Visual Studio – Ashish

+0

Я получаю ошибку в этой строке, поскольку объект ref не установлен GridView1.HeaderRow. Ячейки [0] .Visible = Convert.ToBoolean (arr [0]), который находится под событием нажатия кнопки – Ashish

ответ

0

неисправность, скорее всего, будет с Convert.ToBoolean(arr[0]); (см линию GridView1.HeaderRow.Cells[0].Visible = Convert.ToBoolean(arr[0]);)

Я бы поставил тег разрыва на линии разломов и посмотрел, что такое значение arr[0]. Я бы предположил, что arr пуст или null, и ваш ViewState не возвращает ожидаемые данные. Возможно, потому, что ваш метод getcheckedgridview() не вызывается вашим кодом (или, по крайней мере, не кодом, который вы указали)!

Вы могли бы попробовать (если единственное изменением является первой линией методы)

protected void btnExportExcel_Click(object sender, EventArgs e) 
{ 
    getcheckedgridview();//Only change to your code 
    Response.Clear(); 
    Response.Buffer = true; 
    Response.AddHeader("content-disposition","attachment;filename=GridViewExport.xls"); 
    Response.Charset = ""; 
    Response.ContentType = "application/vnd.ms-excel"; 
    StringWriter sw = new StringWriter(); 
    HtmlTextWriter hw = new HtmlTextWriter(sw); 
    GridView1.AllowPaging = false; 
    GridView1.DataBind(); 
    GridView1.HeaderRow.Style.Add("background-color", "#FFFFFF"); 
    GridView1.HeaderRow.Cells[0].Style.Add("background-color", "green"); 
    GridView1.HeaderRow.Cells[1].Style.Add("background-color", "green"); 
    GridView1.HeaderRow.Cells[2].Style.Add("background-color", "green"); 
    ArrayList arr = (ArrayList)ViewState["States"]; 
    GridView1.HeaderRow.Cells[0].Visible = Convert.ToBoolean(arr[0]); 
    GridView1.HeaderRow.Cells[1].Visible = Convert.ToBoolean(arr[1]); 
    GridView1.HeaderRow.Cells[2].Visible = Convert.ToBoolean(arr[2]); 
    GridView1.HeaderRow.Cells[0].FindControl("chkCol0").Visible = false; 
    GridView1.HeaderRow.Cells[1].FindControl("chkCol1").Visible = false; 
    GridView1.HeaderRow.Cells[2].FindControl("chkCol2").Visible = false; 

    for (int i = 0; i < GridView1.Rows.Count; i++) 
    { 

     GridViewRow row = GridView1.Rows[i]; 
     row.Cells[0].Visible = Convert.ToBoolean(arr[0]); 
     row.Cells[1].Visible = Convert.ToBoolean(arr[1]); 
     row.Cells[2].Visible = Convert.ToBoolean(arr[2]); 
     row.BackColor = System.Drawing.Color.White; 
     row.Attributes.Add("class", "textmode"); 

     if (i % 2 != 0) 
     { 
      row.Cells[0].Style.Add("background-color", "#C2D69B"); 
      row.Cells[1].Style.Add("background-color", "#C2D69B"); 
      row.Cells[2].Style.Add("background-color", "#C2D69B"); 
     } 

    } 

    GridView1.RenderControl(hw); 
    string style = @"<style> .textmode { mso-number-format:\@; } </style>"; 
    Response.Write(style); 
    Response.Output.Write(sw.ToString()); 
    Response.End(); 
} 

Редактировать

На основе ваших комментариев, я думаю, что сообщение об ошибке теперь из вашего кода не находя контроль. Так

CheckBox chkCol0 = (CheckBox)GridView1.HeaderRow.Cells[0].FindControl("chkCol0"); 

не находит контроля под названием «chkCol0» и так поэтому chkCol0 равна нулю.

+0

, пожалуйста, сделайте это .... – Ashish

+0

@Ashish - что делать? Я добавил код для вас сейчас с объяснением того, что, по моему мнению, происходит. – Dave

+0

теперь я получаю ту же ошибку в arr.Add (chkCol0.Checked); как код находится под методом getcheckedgridview – Ashish

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