2011-02-13 109 views
2

我正在使用以下代码来检查以前添加到复选框列表中的数据库表中的值,但在此处得到'未设置为对象实例的对象引用'错误:未将对象引用设置为对象的实例

ListItem currentCheckBox = chkbx.Items.FindByValue(rdr["MemberID"].ToString()); 

这是代码,感谢您的帮助!

SqlDataReader rdr = null; 
SqlConnection conn = new SqlConnection(GetConnectionString()); 
SqlCommand cmd5 = new SqlCommand("SELECT MemberID FROM ProjectIterationMember WHERE ProjectIterationID IN (SELECT ProjectIterationID FROM Iterations WHERE ProjectID = '" + proj_id + "')", conn); 

try 
{ 
    conn.Open(); 
    rdr = cmd5.ExecuteReader(); 

    CheckBoxList chkbx = (CheckBoxList)FindControl("project_members"); 
    while (rdr.Read()) 
    { 
     ListItem currentCheckBox = chkbx.Items.FindByValue(rdr["MemberID"].ToString()); 
     if (currentCheckBox != null) 
     { 
      currentCheckBox.Selected = true; 
     } 
    } 
} 
finally 
{ 
    if (rdr != null) 
    { 
     rdr.Close(); 
    } 

    if (conn != null) 
    { 
     conn.Close(); 
    } 
} 
+2

Verfy那(CheckBoxList的)的FindControl( “project_members”)发现你的控制。而且rdr [“MemberID”]不能从数据库返回空值。 – 2011-02-13 17:11:20

+0

非常感谢lazyberezivsky - 我在手风琴上有了自己的checkboxlist ...现在就开始工作了。 – MiziaQ 2011-02-13 17:27:39

+1

这些问题是练习排除故障的好地方! (即调试器,更紧密的堆栈跟踪分析和推理,本地测试,分而治之/日志记录等) – 2011-02-13 19:17:49

回答

1

要么rdr["MemberID"]返回null或chkbx是null作为控制找不到。尝试使用rdr[0]代替案例,在第二种情况下,确保找到您的控件。

3

想想也重构你的代码分离表示逻辑和数据访问逻辑:

private void SelectProjectMembers(int projectId) 
{ 
    CheckBoxList chkbx = (CheckBoxList)FindControl("project_members"); 
    // verify if chkbx found 

    foreach (string memberId in GetMemberIdsFor(projectId)) 
    { 
     ListItem memberItem = chkbx.Items.FindByValue(memberId); 

     if (memberItem != null) 
      memberItem.Selected = true; 
    } 
} 

private IEnumerable<string> GetMemberIdsFor(int projectId) 
{ 
    List<string> memberIds = new List<string>(); 
    string query = String.Format("SELECT MemberID FROM ProjectIterationMember WHERE ProjectIterationID IN (SELECT ProjectIterationID FROM Iterations WHERE ProjectID = '{0}')", projectId); 

    // using statements will dispose connection, command and reader object automatically 
    using (SqlConnection conn = new SqlConnection(GetConnectionString())) 
    using (SqlCommand cmd5 = new SqlCommand(query, conn)) 
    { 
     conn.Open(); 

     using (SqlDataReader rdr = cmd5.ExecuteReader()) 
     { 
      while (rdr.Read()) 
       memberIds.Add(rdr["MemberID"].ToString()); 
     } 
    } 

    return memberIds; 
} 
相关问题