 <p>I experienced the same thing. An alternative would be to add a Label control and set the properties on that instead.</p> <p>Rather than using a BoundField, use a TemplateField. Assuming that your data is returning an indexable item:</p> <pre><code>&lt;asp:GridViewControl runat="server" ID="GridView2" AutoGenerateColumns="false"&gt; &lt;asp:BoundField HeaderText="Field0" DataField="[0]" /&gt; &lt;asp:BoundField HeaderText="Field1" DataField="[1]" /&gt; &lt;asp:TemplateField HeaderText="Monkey1" /&gt; &lt;asp:TemplateField HeaderText="Monkey2" /&gt; &lt;/asp:GridViewControl&gt; </code></pre> <p>Then in the code-behind:</p> <pre><code>protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { var data_item = e.Row.DataItem; // Can use "as &lt;type&gt;;" if you know the type. if (data_item != null) { for (int i = 2; i &lt;= 3; i++) { var cell_content = new Label(); e.Row.Cells[i].Controls.Add(cell_content); cell_content.Text = data_item[i]; if (data_item[i].Contains("monkey")) { cell_content.Attributes.Add("class", "monkey bold"); } else { cell_content.Attributes.Add("class", "nomonkey bold"); } } } </code></pre> <p>Of course an alternative would be to add the Label in the TemplateField -> ItemTemplate declaration with an ID and use "Cells[i].FindControl("label_id")".</p>