【问题标题】:Casting Exception in ASP.NET Web Application在 ASP.NET Web 应用程序中转换异常
【发布时间】:2017-04-07 06:13:42
【问题描述】:

我有一个函数:

  private void ds_ItemBound(object sender, DataGridItemEventArgs e)
        {
            if (e.Item.ItemIndex >= 0)
            {
                e.Item.Cells[0].Controls.Add(Utility.GetImage("Delegate"));

                e.Item.Attributes.Add("Description", ((System.Data.DataRowView)(e.Item.DataItem)).Row["DelegateDescription"].ToString());
                string DelegateName = ((System.Data.DataRowView)(e.Item.DataItem)).Row["DelegateName"].ToString();

                e.Item.Attributes.Add("DelegateName", ((System.Data.DataRowView)(e.Item.DataItem)).Row["DelegateName"].ToString());

                ((System.Web.UI.WebControls.CheckBox)(e.Item.Cells[3].Controls[0])).Checked = false;


                if (hDelegates.Value != "")
                {

                    string[] selectedDelegates = hDelegates.Value.Split(new char[] { ',' });
                    foreach (string delegate in selectedDelegates)
                    {

                        if (delegate.Equals(delegateName))
                        {
                            count++;
                            ((System.Web.UI.WebControls.CheckBox)(e.Item.Cells[3].Controls[0])).Checked = true;

                            break;
                        }
                    }
                }
            }
            if (count == dDelegates.Items.Count)
                lblEditCheck.Checked = true;
            else
                lblEditCheck.Checked = false;
        }

UI 有一个表格,每一行对应一个条目。因此,每一行都有一个图像、一个描述、一个名称。

我在以下行的代码中遇到异常:

((System.Web.UI.WebControls.CheckBox)(e.Item.Cells[3].Controls[0])).Checked = false;

例外是:Unable to cast object of type 'System.Web.UI.LiteralControl' to type 'System.Web.UI.WebControls.CheckBox'.

此外,e.Item.Cells[3].Controls[0]System.Web.UI.LiteralControl

复选框标记看起来像<asp:CheckBox ID="lblEditCheck" runat="server" TabIndex="0" Width="30px" CssClass="ColumnHeader" /></td>

我坚持让这个工作好几天了。如果有更多有用的信息,请告诉我。

非常感谢您的帮助。

什么没用:

var checkbox = (System.Web.UI.WebControls.CheckBox)e.Item.FindControl("lblEditCheck");
checkbox.Checked = false;

在这种情况下,复选框为空。并抛出相应的异常。

【问题讨论】:

标签: c# asp.net .net visual-studio web-applications


【解决方案1】:

使用您想要获取的控件的 ID 并使用 FindControl 获取 CheckBox。还要对数据行使用ListViewItemType.DataItem,因为对于非 DataItem 行,您将获得 null。

if (e.Item.ItemType == ListViewItemType.DataItem)
{
    ((System.Web.UI.WebControls.CheckBox)(e.Item.FindControl("lblEditCheck")).Checked = false;
}

如果您期望某些行可能没有复选框控件,那么您可以先获取复选框,然后将其更改为已更改状态。

CheckBox lblEditCheck = e.Item.FindControl("lblEditCheck") as CheckBox;
if(lblEditCheck != null)
     lblEditCheck.Checked = false;

【讨论】:

  • 嗨,阿迪尔,感谢您的回答。但是,我尝试了 e.Item.FindControl("lblEditCheck") 并返回 null。肯定有一个复选框,因为我可以在标记中看到它。任何其他可能有效的方式。谢谢。
  • 它应该可以工作,如果(e.Item.ItemType == ListViewItemType.DataItem),您是否在条件下使用了 FindControl?还要添加完整的相关 HTML。
  • 我不能这样做,因为它说 Operator == 不能应用于 ListViewItem 类型的项目。
  • 还有一个愚蠢的问题:由于我的代码中出现此异常:应用程序有一个错误:仅加载数据网格的一行。我想,为什么连一行都被正确加载了。
  • 它不应该给你操作错误,你使用 ListViewItemType.DataItem 吗?给我看看你出错的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
相关资源
最近更新 更多