2016-01-09 38 views
-1

我试图将代码隐藏的protected DataRow[] msgArray;传递给.net页面。C#将DataRow []变量从代码后面传递到.netpage

msgArray包含来自我选择的数据库表的行,当我这样做时Response.Write(msgArray[0]["comment"])它正确输出我存储在我的数据库的注释列中的内容。 的问题是,当我加载页面,我不能做我的.NET页面一样我这样做,其中:

<asp:Panel ID="commentSection" runat="server"> 
     <%= msgArray[0]["comment"] %> 
    </asp:Panel> 

我得到一个Object reference not set to an instance of an object.

我在做什么错?

这是我的代码隐藏(.cs):

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 MySql.Data.MySqlClient; 

namespace Groups 
{ 
    public partial class Group : System.Web.UI.Page 
    { 
     MySql.Data.MySqlClient.MySqlConnection conn; 
     MySql.Data.MySqlClient.MySqlCommand cmd; 
     MySql.Data.MySqlClient.MySqlDataReader reader; 
     String queryStr; 
     String gname; 
     String gtype; 
     String uname; 
     DataTable group = new DataTable(); 
     DataTable msg = new DataTable(); 

     protected DataRow[] msgArray; 



     protected void Page_Load(object sender, EventArgs e) 
     { 
      String id = Request.QueryString["id"]; 

      if (id != null) 
      { 
       String connString = System.Configuration.ConfigurationManager.ConnectionStrings["GroupsConnString"].ToString(); 
       conn = new MySql.Data.MySqlClient.MySqlConnection(connString); 

       conn.Open(); 
       queryStr = "SELECT g.*, (SELECT COUNT(id) FROM app_groups.users_groups_leg ugl WHERE ugl.id_group = g.id) as member_count FROM app_groups.groups g WHERE g.id = " + id; 
       cmd = new MySql.Data.MySqlClient.MySqlCommand(queryStr, conn); 

       group.Load(reader = cmd.ExecuteReader()); 
       var groupArray = group.AsEnumerable().ToArray(); 
       reader.Close(); 

       int member_count = 0; 
       int.TryParse(groupArray[0]["member_count"].ToString(), out member_count); 

       Panel grInfo = new Panel(); 
       grInfo.Controls.Add(new LiteralControl("<br/><div class='panel panel-primary'><div class='panel-heading'><h2>" + groupArray[0]["group_name"] + "</h2></div><div class='panel-body'><span>Categorie: <span class='title'>" + groupArray[0]["group_type"] + "</span></span><br/><span class='membrii'>" + (member_count == 1 ? member_count + " membru" : member_count + " membri") + "</span><br/><span>Fondat pe: " + ConvertUnixTimeStamp(groupArray[0]["founded"].ToString()) + "</span><br/></div></div>")); 
       groupInfo.Controls.Add(grInfo); 

       conn.Close(); 

       showComments(); 
      } 

     } 

     public static DateTime? ConvertUnixTimeStamp(string unixTimeStamp) 
     { 
      return new DateTime(1970, 1, 1).AddSeconds(Convert.ToDouble(unixTimeStamp) + 3600*2); 
     } 

     public DataRow[] showComments() 
     { 
      String id = Request.QueryString["id"]; 
      if (id != null) 
      { 
       String connString = System.Configuration.ConfigurationManager.ConnectionStrings["GroupsConnString"].ToString(); 
       conn = new MySql.Data.MySqlClient.MySqlConnection(connString); 

       conn.Open(); 
       queryStr = "SELECT gc.* FROM app_groups.group_comments gc WHERE gc.id_group = " + id; 
       cmd = new MySql.Data.MySqlClient.MySqlCommand(queryStr, conn); 

       msg.Load(reader = cmd.ExecuteReader()); 
       msgArray = msg.AsEnumerable().ToArray(); 
       reader.Close(); 

       Response.Write(msgArray[0]["comment"]); 

       /*Panel grComments = new Panel(); 
       grComments.Controls.Add(new LiteralControl("")); 
       groupInfo.Controls.Add(grComments);*/ 
      } 

      return msgArray; 
     } 
    } 
} 
+1

如果你把断点的.cs页和.aspx页面中,其中一个被先打? –

+0

为什么要将注释放在数据表中? – Kami

+0

@Kami,因为我需要它们,所以我需要将它们传递给.aspx页面,以便我可以迭代并将它们添加到div,这样做更简单,而不是在后面的代码中创建'New Panels'并向每个面板 – southpaw93

回答

1

创建一个新类dataAccess.cs

using System; 
using System.Data; 

namespace Groups 
{ 
    public class dataAccess 
    { 
     public List<string> GetComments() 
     { 
      String connString = System.Configuration.ConfigurationManager.ConnectionStrings["GroupsConnString"].ToString(); 
      conn = new MySql.Data.MySqlClient.MySqlConnection(connString); 

      try 
      { 
       MySql.Data.MySqlClient.MySqlDataReader reader; 
       DataTable msg = new DataTable(); 
       conn.Open(); 
       List<string> comments = new List<string>(); 
       queryStr = "SELECT gc.* FROM app_groups.group_comments gc WHERE gc.id_group = " + id; 
       cmd = new MySql.Data.MySqlClient.MySqlCommand(queryStr, conn); 

       msg.Load(reader = cmd.ExecuteReader()); 
       foreach(DataRow dr in msg.Rows) 
       { 
        comments.Add(dr["comment"]); 
       } 
       reader.Close(); 
       return comments; 
      } 
      catch (Exception ex) 
      { 
       //throw ex; 
      } 
     } 
    } 
} 

在ASPX页面

<asp:Panel ID="commentSection" runat="server"> 
    <% 
     var data = Groups.dataAccess.GetComments(); 
     foreach(string c in data) 
     { 
      Response.Write("<p>" + c + "</p>"); 
     } 
    %> 
</asp:Panel> 
0

根据ASP.NET页面生命周期,你的方法showComments()<%= msgArray[0]["comment"] %>部分后调用。因此它在那里不可用。 最好的方法是在你的.aspx页面中有一个像Label一样的控件,并从showComments()方法更新文本属性。

相关问题