2016-09-19 7 views
1

グリッドビューのフッターにドロップダウンリストがあります。これは挿入用のものなので、データベースから読み込むようにします。グリッド表示のドロップダウンリストフッター(NullReferenceException)

私はhereからこの目的のためのコードを得ましたが、それは動作しますが、私がフッターのために同じものを書くとき、それは私にエラーを与えます:System.NullReferenceException。

私のコードは怒鳴るです:背後

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="OnRowDataBound" ShowFooter="True"> 
    <Columns> 
     <asp:BoundField HeaderText="EId" DataField="EId" /> 
     <asp:TemplateField HeaderText = "CName"> 
      <ItemTemplate> 
       <asp:Label ID="lblCountry" runat="server" Text='<%# Eval("CName") %>' Visible = "false" /> 
       <asp:DropDownList ID="ddlCountries" runat="server"> 
       </asp:DropDownList> 

      </ItemTemplate> 
      <FooterTemplate> 

       <asp:DropDownList ID="ddlCName" CssClass="auto-style16" Width="80px" runat="server" ></asp:DropDownList> 


     </FooterTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

コード:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      GridView1.DataSource = GetData("select * from TbExam inner join TBCourse on TBCourse.CId = TbExam.CId inner join TbCourseMajor on TbCourseMajor.CId=TBCourse.CId"); 
      GridView1.DataBind(); 
     } 
    } 

    private DataSet GetData(string query) 
    { 
     string conString = ConfigurationManager.ConnectionStrings["RigesterConnectionString1"].ConnectionString; 

    SqlCommand cmd = new SqlCommand(query); 
     using (SqlConnection con = new SqlConnection(conString)) 
     { 
      using (SqlDataAdapter sda = new SqlDataAdapter()) 
      { 
       cmd.Connection = con; 
       sda.SelectCommand = cmd; 
       using (DataSet ds = new DataSet()) 
       { 
        sda.Fill(ds); 
        return ds; 
       } 
      } 
     } 
    } 

    protected void OnRowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      //Find the DropDownList in the Row 
      DropDownList ddlCountries = (e.Row.FindControl("ddlCountries") as DropDownList); 
      ddlCountries.DataSource = GetData("SELECT * FROM TBCourse INNER JOIN TbCourseMajor ON TBCourse.CId = TbCourseMajor.CId "); 
      ddlCountries.DataTextField = "CName"; 
      ddlCountries.DataValueField = "CId"; 
      ddlCountries.DataBind(); 

      //Add Default Item in the DropDownList 
      ddlCountries.Items.Insert(0, new ListItem("Please select")); 

      DropDownList ddlCName = GridView1.FooterRow.FindControl("ddlCName") as DropDownList; 
      ddlCName.DataSource = GetData("SELECT * FROM TBCourse INNER JOIN TbCourseMajor ON TBCourse.CId = TbCourseMajor.CId "); 
      ddlCName.DataTextField = "CName"; 
      ddlCName.DataValueField = "CId"; 
      ddlCName.DataBind(); 

      //Add Default Item in the DropDownList 
      ddlCName.Items.Insert(0, new ListItem("Please select")); 

     } 
    } 
+0

デバッグを試して、NullReferenceExceptionがスローされている場所を特定しましたか? –

+0

どのラインですか? – Berkay

+0

申し訳ありません私はエラーの行を参照して忘れていました。次の行にあります:DropDownList ddlCName = GridView1.FooterRow.FindControl( "ddlCName")as DropDownList; – AL3MS

答えて

1

asp.net GridViewの火災に関するOnRowDataBoundのでグリッドとフッター行中のすべてのデータバインディングの行がバインドされないことがあります後...だからSystem.NullReferenceException.は自然なので、代わりに次のようにすることができます。

rowDataBoundの後にGridViewでフッターを検索

とアップデートデータベース

だから、完全なコード

.aspxの

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
      ShowFooter="True" ondatabound="GridView1_DataBound"> 
    <Columns> 
     <asp:BoundField HeaderText="EId" DataField="UserId" /> 
     <asp:TemplateField HeaderText = "CName"> 
      <ItemTemplate> 
       <asp:Label ID="lblCountry" runat="server" Text='<%# Eval("UserId") %>' Visible = "True" /> 

      </ItemTemplate> 
      <FooterTemplate> 

       <asp:DropDownList ID="ddlCName" CssClass="auto-style16" Width="80px" runat="server" > 
        <asp:ListItem Selected="True">1</asp:ListItem> 
        <asp:ListItem>2</asp:ListItem> 
       </asp:DropDownList> 


     </FooterTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

とは.cs

protected void Page_Load(object sender, EventArgs e) 
    { 
     GridView1.DataSource = DbUtilities.GetDataTableFromSqlQuery("select top 10 * from Users"); 
     GridView1.DataBind(); 
    } 

    protected void GridView1_DataBound(object sender, EventArgs e) 
    { 
     GridViewRow row = GridView1.FooterRow; 

     var firstName = ((DropDownList)row.Cells[1].FindControl("ddlCName")).SelectedValue; 
     var s = firstName; 
    } 
+0

ありがとう:D私はdataboundのコードを入れて、それは動作します! – AL3MS

1

これが機能している:

protected void GridView1_DataBound1(object sender, EventArgs e) 
     { 
      //GridViewRow row = GridView1.FooterRow; 

      //var CName = ((DropDownList)row.Cells[1].FindControl("ddlCName")).SelectedValue; 
      //var s = CName; 

      DropDownList ddlCName = GridView1.FooterRow.FindControl("ddlCName") as DropDownList; 
      ddlCName.DataSource = GetData("SELECT * FROM TBCourse INNER JOIN TbCourseMajor ON TBCourse.CId = TbCourseMajor.CId "); 
      ddlCName.DataTextField = "CName"; 
      ddlCName.DataValueField = "CId"; 
      ddlCName.DataBind(); 

      //Add Default Item in the DropDownList 
      ddlCName.Items.Insert(0, new ListItem("Please select")); 
     } 
関連する問題