为什么会出现无法投射对象的错误

本文关键字:对象 错误 为什么 | 更新日期: 2023-09-27 18:20:50

我有以下GridView:

<asp:Panel ID="pnlDropDown" runat="server" ClientIDMode="Static" CssClass="pnlDropDown">
    <!-- TASK NAME -->
    <asp:DropDownList ID="ddlTaskName" CssClass="chosen-select" DataSourceID="dsPopulateTaskName" AutoPostBack="true" DataValueField="Task Name" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlTaskName_onSelectIndexChanged">
        <asp:ListItem Text="All" Value="%"></asp:ListItem>
    </asp:DropDownList>
    <asp:SqlDataSource ID="dsPopulateTaskName" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
    <!-- SERVICE -->
    <asp:DropDownList ID="ddlService" CssClass="chosen-select" DataSourceID="dsPopulateService" AutoPostBack="true" DataValueField="Service" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlService_onSelectIndexChanged">
        <asp:ListItem Text="All" Value="%"></asp:ListItem>
    </asp:DropDownList>
    <asp:SqlDataSource ID="dsPopulateService" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
    <!-- STATUS -->
    <asp:DropDownList ID="ddlStatus" CssClass="chosen-select" DataSourceID="dsPopulateStatus" AutoPostBack="true" DataValueField="Status" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlStatus_onSelectIndexChanged">
        <asp:ListItem Text="All" Value="%"></asp:ListItem>
    </asp:DropDownList>
    <asp:SqlDataSource ID="dsPopulateStatus" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
    <!-- DUE DATE -->
    <asp:DropDownList ID="ddlDueDate" CssClass="chosen-select" DataSourceID="dsPopulateDueDate" AutoPostBack="true" DataValueField="Due Date" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlDueDate_onSelectIndexChanged">
        <asp:ListItem Text="All" Value="%"></asp:ListItem>
    </asp:DropDownList>
    <asp:SqlDataSource ID="dsPopulateDueDate" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
    <!-- OWNER -->
    <asp:DropDownList ID="ddlOwner" CssClass="chosen-select" DataSourceID="dsPopulateOwner" AutoPostBack="true" DataValueField="Owner" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlOwner_onSelectIndexChanged">
        <asp:ListItem Text="All" Value="%"></asp:ListItem>
    </asp:DropDownList>
    <asp:SqlDataSource ID="dsPopulateOwner" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
    <!-- CLIENT -->
    <asp:DropDownList ID="ddlClient" CssClass="chosen-select" DataSourceID="dsPopulateClient" AutoPostBack="true" DataValueField="Client" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlClient_onSelectIndexChanged">
        <asp:ListItem Text="All" Value="%"></asp:ListItem>
    </asp:DropDownList>
    <asp:SqlDataSource ID="dsPopulateClient" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
    <!-- SITE -->
    <asp:DropDownList ID="ddlSite" CssClass="chosen-select" DataSourceID="dsPopulateSite" AutoPostBack="true" DataValueField="Site" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlSite_onSelectIndexChanged">
        <asp:ListItem Text="All" Value="%"></asp:ListItem>
    </asp:DropDownList>
    <asp:SqlDataSource ID="dsPopulateSite" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
    <!-- PRACTICE -->
    <asp:DropDownList ID="ddlPractice" CssClass="chosen-select" DataSourceID="dsPopulatePractice" AutoPostBack="true" DataValueField="Practice" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlPractice_onSelectIndexChanged">
        <asp:ListItem Text="All" Value="%"></asp:ListItem>
    </asp:DropDownList>
    <asp:SqlDataSource ID="dsPopulatePractice" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
    <!-- PROVIDER -->
    <asp:DropDownList ID="ddlProvider" CssClass="chosen-select" DataSourceID="dsPopulateProvider" AutoPostBack="true" DataValueField="Provider" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlProvider_onSelectIndexChanged">
        <asp:ListItem Text="All" Value="%"></asp:ListItem>
    </asp:DropDownList>
    <asp:SqlDataSource ID="dsPopulateProvider" runat="server" ConnectionString="<%$ ConnectionStrings:gvConnString %>" SelectCommand=""></asp:SqlDataSource>
    <asp:Label ID="lblDDLBlank" runat="server" ClientIDMode="Static" Text=""></asp:Label>
</asp:Panel>
<asp:GridView ShowHeaderWhenEmpty="false" AlternatingRowStyle-BackColor="#EBE9E9" AutoGenerateColumns="false" OnSorting="yourTasksGV_Sorting" AllowSorting="true" ID="yourTasksGV" runat="server" ClientIDMode="Static" EmptyDataText="You currently have no tasks assigned to you" OnRowDataBound="yourTasksGV_RowDataBound" OnRowCreated="yourTasksGV_RowCreated">
    <Columns>
        <asp:HyperLinkField Target="_self" DataNavigateUrlFields="Task Detail" DataTextField="Task Name" DataNavigateUrlFormatString="" HeaderText="Task Detail" SortExpression="Task Name" ItemStyle-CssClass="taskTableColumn" />
        <asp:TemplateField>
            <HeaderTemplate>
                <asp:Label ID="lblDep" runat="server" ClientIDMode="Static" Text="Dependencies"></asp:Label>
            </HeaderTemplate>
            <ItemTemplate>
                <asp:Button runat="server" Text="Dependencies" ID="btnShowDepend" CommandArgument='<%#Eval("Object") %>' />                
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Service" HeaderText="Service" SortExpression="Service" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Status" HeaderText="Status" SortExpression="Status" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Due Date" HeaderText="Due" SortExpression="Due Date" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Owner" HeaderText="Owner" SortExpression="Owner" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Client" HeaderText="Client" SortExpression="Client" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Site" HeaderText="Site" SortExpression="Site" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Practice" HeaderText="Practice" SortExpression="Practice" ItemStyle-CssClass="taskTableColumn" />
        <asp:BoundField DataField="Provider" HeaderText="Provider" SortExpression="Provider" ItemStyle-CssClass="taskTableColumn" />
    </Columns>
</asp:GridView>

填充GridView的以下函数:

public void PullData(string sortExp, string sortDir, bool blOnLoad)
{
    query = "";
    DataTable taskData = new DataTable();
    connString = @"";
    if (!blOnLoad)
    {
        //SET UP THE "query" QUERY STRING
    }
    else
    {
        //SET UP THE "query" QUERY STRING
    }
    using (SqlConnection conn = new SqlConnection(connString))
    {
        try
        {
            SqlCommand cmd = new SqlCommand(query, conn);
            // create data adapter
            SqlDataAdapter da = new SqlDataAdapter(query, conn);
            // this will query your database and return the result to your datatable
            myDataSet = new DataSet();
            da.Fill(myDataSet);
            myDataView = new DataView();
            myDataView = myDataSet.Tables[0].DefaultView;
            if (sortExp != string.Empty)
            {
                myDataView.Sort = string.Format("{0} {1}", sortExp, sortDir);
            }
            yourTasksGV.DataSource = myDataView;
            yourTasksGV.DataBind();
        }
        catch (Exception ex)
        {
            string error = ex.Message;
        }
    }
}
protected void yourTasksGV_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        GridView hGrid = (GridView)sender;
        GridViewRow gvrRow = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Insert);

        TableHeaderCell tcCellTask = new TableHeaderCell();
        tcCellTask.Controls.Add(ddlTaskName);
        gvrRow.Cells.Add(tcCellTask);
        TableHeaderCell tcCellDep = new TableHeaderCell();
        tcCellDep.Controls.Add(lblDDLBlank);
        gvrRow.Cells.Add(tcCellDep);
        TableHeaderCell tcCellSvc = new TableHeaderCell();
        tcCellSvc.Controls.Add(ddlService);
        gvrRow.Cells.Add(tcCellSvc);
        TableHeaderCell tcCellStats = new TableHeaderCell();
        tcCellStats.Controls.Add(ddlStatus);
        gvrRow.Cells.Add(tcCellStats);
        TableHeaderCell tcCellDD = new TableHeaderCell();
        tcCellDD.Controls.Add(ddlDueDate);
        gvrRow.Cells.Add(tcCellDD);
        TableHeaderCell tcCellOwner = new TableHeaderCell();
        tcCellOwner.Controls.Add(ddlOwner);
        gvrRow.Cells.Add(tcCellOwner);
        TableHeaderCell tcCellCli = new TableHeaderCell();
        tcCellCli.Controls.Add(ddlClient);
        gvrRow.Cells.Add(tcCellCli);
        TableHeaderCell tcCellSit = new TableHeaderCell();
        tcCellSit.Controls.Add(ddlSite);
        gvrRow.Cells.Add(tcCellSit);
        TableHeaderCell tcCellPra = new TableHeaderCell();
        tcCellPra.Controls.Add(ddlPractice);
        gvrRow.Cells.Add(tcCellPra);
        TableHeaderCell tcCellPro = new TableHeaderCell();
        tcCellPro.Controls.Add(ddlProvider);
        gvrRow.Cells.Add(tcCellPro);
        yourTasksGV.Controls[0].Controls.AddAt(0, gvrRow);
        LinkButton btnSort;
        System.Web.UI.WebControls.Image image;
        //iterate through all the header cells
        foreach (TableCell cell in e.Row.Cells)
        {
            //check if the header cell has any child controls
            if (cell.HasControls())
            {
                //get reference to the button column
                btnSort = (LinkButton)cell.Controls[0];
                image = new System.Web.UI.WebControls.Image();
                if (ViewState["sortExp"] != null)
                {
                    //see if the button user clicked on and the sortexpression in the viewstate are same
                    //this check is needed to figure out whether to add the image to this heade column or not
                    if (btnSort.CommandArgument == ViewState["sortExp"].ToString())
                    {
                        //check what type of sort order it is
                        if (ViewState["sortOrder"].ToString() == "Asc")
                        {
                            image.ImageUrl = "../theImages/up.png";
                            image.CssClass = "hdrImage";
                        }
                        else
                        {
                            image.ImageUrl = "../theImages/down.png";
                            image.CssClass = "hdrImage";
                        }
                        cell.Controls.Add(image);
                    }
                }
            }
        }
    }
}

当我运行web应用程序时,RowCreated会被迭代,然后它会给我以下错误:

unable to cast object of type 'system.web.ui.literalcontrol' to type 'system.web.ui.webcontrols.linkbutton'

如何解决错误?

为什么会出现无法投射对象的错误

问题可能是在一个标题单元格中添加Label:

TableHeaderCell tcCellDep = new TableHeaderCell();
tcCellDep.Controls.Add(lblDDLBlank);
gvrRow.Cells.Add(tcCellDep);

稍后查看标题单元格时,尝试将此Label强制转换为LinkButton,这是不可能的。

要修复它,请检查它是否真的是LinkButton:

if (cell.HasControls())
{
    //get reference to the button column
    btnSort = cell.Controls[0] as LinkButton;
    image = new System.Web.UI.WebControls.Image();
    if (ViewState["sortExp"] != null && btnSort != null)
    {
        ....
    }
}

问题可能是这一行:

btnSort = (LinkButton)cell.Controls[0];

单元格中的第一个控件很可能是一个Literal(尽管我看到了一个"HyperlinkField"),您正试图将其转换为linkButton,从而引发此错误。