专栏' ID'不属于表DefaultView

时间:2016-08-09 09:40:33

标签: c# gridview rowdatabound

我有一个Gridview" Gridview_ActionPlan"使用DataKey" ID"和一个RowDataBound事件,根据数据源的值为某些单元格着色。直到这里一切都很好。现在我添加了一个命令,根据条件提供对一列的可见性,并抛出错误" Column' ID'不属于表DefaultView"

if (e.Row.Cells[3].Text != "1" && e.Row.Cells[2].Text != "2")
{
    Gridview_ActionPlan.Columns[5].Visible = true;
    LinkButton LB2 = e.Row.Cells[5].FindControl("ButtonOpen") as LinkButton;
    LB2.Visible = true;
}

...和专栏[5]

        <asp:templatefield ItemStyle-HorizontalAlign="center" Visible="false">
            <ItemTemplate>
                <asp:LinkButton ID="ButtonOpen" runat="server" CommandArgument = '<%# Eval("ID") %>' OnClick="OpenNode" style="vertical-align:text-bottom;text-decoration:none" Visible="false">
                    <asp:Image runat="server" src="img/plus_.png" id="OpenNodeIMG" border="0" Visible="true"/>
                </asp:LinkButton>
            </ItemTemplate>
        </asp:templatefield>

现在,如果我给该列提供静态可见性并删除&#34; Gridview_ActionPlan.Columns [5] .Visible = true;&#34;然后不会抛出任何错误。这对我来说没有意义

马丁

这是完整的OnRowDataBound事件: 注释:SQLConnection部分根据所选语言使用正确的标题填充网格。这有点费时间,所以如果有人有更好的想法,请随意...虽然这不是那篇文章的问题

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    var gv = (GridView)sender;
    string GridID = Convert.ToString(gv.ID);

    SqlConnection objConn = new SqlConnection("Data Source=XXXXXX");
    SqlDataAdapter adapter = new SqlDataAdapter();
    SqlCommand objCommand = new SqlCommand(@"select Text
                                             from EPC_Menu
                                             where language = @language and MenuControlID = @GridID
                                             order by MenuID", objConn);
    objCommand.Parameters.Add("@GridID", SqlDbType.NVarChar).Value = GridID;
    objCommand.Parameters.Add("@language", SqlDbType.NVarChar).Value = LanguageLabel.Text;
    DataSet t = new DataSet();
    adapter.SelectCommand = objCommand;
    objConn.Open();
    adapter.Fill(t);
    objConn.Close();

    if (e.Row.RowType == DataControlRowType.Header)
    {
        for(int i = 0; i+6 < gv.Columns.Count; i++)
        {
            if (t.Tables[0].Rows.Count > 0)
            {
                e.Row.Cells[i+6].Text = t.Tables[0].Rows[i][0].ToString();
            }
        }
    }
    else
    {
        if (e.Row.Cells[1].Text == "True")
        {
            e.Row.Cells[9].BackColor = System.Drawing.ColorTranslator.FromHtml("#FFFF00");
            e.Row.Cells[10].BackColor = System.Drawing.ColorTranslator.FromHtml("#FFFF00");
        }
        else if (e.Row.Cells[2].Text == "2")
        {
            e.Row.BackColor = System.Drawing.ColorTranslator.FromHtml("#CCECF4");
        }
        if (e.Row.Cells[3].Text != "1" && e.Row.Cells[2].Text != "2" && !string.IsNullOrEmpty(e.Row.Cells[3].Text) && e.Row.RowType == DataControlRowType.DataRow && Gridview_ActionPlan.EditIndex != e.Row.RowIndex)
        {
            LinkButton LB2 = e.Row.Cells[5].FindControl("ButtonOpen") as LinkButton;
            LB2.Visible = true;
        }
    }
}

这里是第0 - 5列的gridview已经发布:

<asp:GridView ID="Gridview_ActionPlan" runat="server" 
    DataSourceID="ActionPlan" 
    DataKeyNames="ID" 
    AutoGenerateColumns="false" 
    Font-Names="Arial" 
    OnRowDataBound="OnRowDataBound">
    <RowStyle BorderColor="White" 
        Font-Size="12px" VerticalAlign="Bottom" />
    <Columns>
        <asp:BoundField DataField="ID" 
            ItemStyle-CssClass="hiddencol" 
            HeaderStyle-CssClass="hiddencol" />
        <asp:BoundField DataField="CustomerRequired" 
            ItemStyle-CssClass="hiddencol" 
            HeaderStyle-CssClass="hiddencol" />
        <asp:BoundField DataField="Type" 
            ItemStyle-CssClass="hiddencol" 
            HeaderStyle-CssClass="hiddencol" />
        <asp:BoundField DataField="CNT" 
            ItemStyle-CssClass="hiddencol" 
            HeaderStyle-CssClass="hiddencol" />
        <asp:TemplateField ItemStyle-HorizontalAlign="left" 
            ItemStyle-Width="50px" Visible="false">
            <ItemTemplate>
                <asp:ImageButton ID="LINKButton2" runat="server" 
                    CommandName="Edit" 
                    ImageUrl="img/edit.png" 
                    Style="vertical-align: text-bottom" />&nbsp;
                <asp:LinkButton ID="ButtonSelect" runat="server" 
                    CommandName="Select" 
                    CommandArgument='<%# Eval("ID") %>' 
                    Style="vertical-align: text-bottom; text-decoration: none" 
                    OnClick="AddNewMileStone" Visible="true">
                        <asp:Image runat="server" ID="ImageMS" 
                            ImageUrl="img/select.png" 
                            Style="vertical-align: text-bottom; text-decoration: none" 
                            BorderStyle="None" />
                </asp:LinkButton>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:ImageButton ID="InsertButton" runat="server" 
                    CommandName="Update" 
                    ImageUrl="img/save.png" 
                    Style="vertical-align: text-bottom" />&nbsp;&nbsp;
                <asp:ImageButton ID="LINKButton2" runat="server" 
                    CommandName="Cancel" 
                    ImageUrl="img/cancel2.jpg" 
                    Style="vertical-align: text-bottom" />
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ItemStyle-HorizontalAlign="center" 
            Visible="false">
        <ItemTemplate>
            <asp:LinkButton ID="ButtonOpen" runat="server" 
                CommandArgument = '<%# Eval("ID") %>' 
                OnClick="OpenNode" 
                style="vertical-align:text-bottom;text-decoration:none" 
                Visible="false">
                <asp:Image id="OpenNodeIMG" runat="server" 
                    src="img/plus_.png" 
                    border="0" 
                    Visible="true"/>
            </asp:LinkButton>
        </ItemTemplate>
    </asp:TemplateField>
    </Columns>
</asp:GridView>

1 个答案:

答案 0 :(得分:0)

  

这有点费时间,所以如果有人有更好的想法,请随意...虽然这不是那篇文章的问题

实际上这应该是一个主要问题。你在这里犯了三件事。

  1. 您正在调用函数来填充RowDataBound的每次迭代中的数据集。如果你有20行和1个标题,那将是20个不必要的数据库调用
  2. 无需打开()连接以使用数据适配器填充数据集
  3. 无需使用Cells [cell_index]`。
  4. 限定.FindControl

    因此,在Gridviews DataBind()事件之后移动代码。伪代码将是,

    Gridview_ActionPlan.DataBind();
    DataSet t = new DataSet();
    var gv = Gridview_ActionPlan;
    string GridID = Convert.ToString(gv.ID);
    
    using (SqlConnection objConn = new SqlConnection("Data Source=XXXXXX"))
    using (SqlCommand objCommand = new SqlCommand(@"select Text
                                        from EPC_Menu
                                        where language = @language and MenuControlID = @GridID
                                        order by MenuID", objConn))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        objCommand.Parameters.Add("@GridID", SqlDbType.NVarChar).Value = GridID;
        objCommand.Parameters.Add("@language", SqlDbType.NVarChar).Value = LanguageLabel.Text;
        adapter.SelectCommand = objCommand;
        adapter.Fill(t);
    }
    
    var headerRow = gv.HeaderRow;
    for (int i = 0; i + 6 < gv.Columns.Count; i++)
    {
        if (t.Tables[0].Rows.Count > 0)
        {
            headerRow.Cells[i + 6].Text = t.Tables[0].Rows[i][0].ToString();
        }
    }
    for (int i = 0; i < gv.Rows.Count; i++)
    {
        if (gv.Rows[i].Cells[1].Text == "True")
        {
            gv.Rows[i].Cells[9].BackColor = System.Drawing.ColorTranslator.FromHtml("#FFFF00");
            gv.Rows[i].Cells[10].BackColor = System.Drawing.ColorTranslator.FromHtml("#FFFF00");
        }
        else if (gv.Rows[i].Cells[2].Text == "2")
        {
            gv.Rows[i].BackColor = System.Drawing.ColorTranslator.FromHtml("#CCECF4");
        }
        if (gv.Rows[i].Cells[3].Text != "1" && 
            gv.Rows[i].Cells[2].Text != "2" && 
            !string.IsNullOrEmpty(gv.Rows[i].Cells[3].Text) &&
            gv.Rows[i].RowType == DataControlRowType.DataRow && 
            Gridview_ActionPlan.EditIndex != gv.Rows[i].RowIndex)
        {
            LinkButton LB2 = gv.Rows[i].FindControl("ButtonOpen") as LinkButton;
            LB2.Visible = true;
        }
    }