GridView DropDownList,处理空值

时间:2014-01-08 22:19:47

标签: asp.net gridview data-binding

我意识到这个问题的变化已被问及我在这里和其他地方尽职尽责地研究了几十个,但到目前为止我无法找到解决方案。希望我只是错过了一些东西,这个优秀社区中的某些人可以帮助我。我已经阅读并尝试了Handling Null Data in Data Source Controls MSDN文章,但也没有运气。

这是我的情况。我正在使用EntityDataSource和SQL Server数据库(如果这很重要),我有一个主表(我们称之为Shipments),它通过外键引用各种子表。例如,Shipment表点有一个Truck列,它引用Truck表。

创建货件时不需要卡车。如果用户稍后编辑货件以添加卡车,一切正常。这是通过GridView模板字段中的DropDownList完成的,就像这样(对不起,我不知道如何格式化这个 - 如果可以的话我会稍后编辑帖子):

<asp:DropDownList ID="ddlTrucks" runat="server" AutoPostBack="false"  AppendDataBoundItems="true"
                        DataTextField="Number" DataValueField="TruckID" DataSourceID="esrcTrucks"
                        SelectedValue='<%# Bind("TruckID") %>'>
                    <asp:ListItem Value="-1" Text="(Select)"></asp:ListItem>
                </asp:DropDownList>

好的,所以如果在发货创建期间没有输入卡车(常见),DropDownList会很好地填充“(选择)”作为所选项目。

然而,如果货物引用卡车,并且该卡车稍后被删除(假设它已经失事并且不再是船队的一部分),那就是我遇到问题并得到“ddlTruck有一个无效的SelectedValue”因为它不存在于项目列表中。参数名称:值“错误消息。

最好,我想阻止这个例外,所以根本不会发生这种情况。但是,如果我必须有一种方法可以捕获此异常并“修复”DDL以便可以显示页面并且用户可以按照自己的方式进行操作吗?怎么/我会在哪里抓到这个?所以,我想我的问题是:

  • 这是数据库设计问题吗?应该删除引用的 实体是以某种方式处理的,我目前没有这样做?
  • 有没有办法防止这种异常发生, 就像没有输入卡车时一样(DDL只显示 “(选择)”)?
  • 如果我需要捕获并处理此异常,我将如何或在何处执行此操作 所以?

为了澄清,DDL保留已删除卡车的数据是的要求。只需显示“选择”,空字符串或任何默认值即可。目的是这不会导致页面崩溃,并且用户应该能够在需要时编辑其他装运细节。

非常感谢任何帮助。我已经花了几天时间在这上面并且无法获得任何工作!如果我可以提供更多信息或者我的帖子中不清楚,请告诉我。

非常感谢!

2 个答案:

答案 0 :(得分:0)

不要在前端的标签中设置SelectedValue,而是尝试在代码隐藏文件的Page_Load中检查TruckID的有效性,并在那里设置所选值。

例如,在这里我将检查TruckID是否为空。如果它有一个值,那么我将所选值设置为TruckID,否则,我会将所选值设置为ddlTrucks中的第一项,假设第一项是默认选择。

protected void Page_Load(Object sender, EventArgs e)
{
    if(!IsPostBack)
        ddlTrucks.SelectedValue = TruckID != Null ? TruckID : ddlTrucks.Items[0].Value;
}

答案 1 :(得分:0)

好的,幸好继续搜索找到了解决方案。由于我在通过GridView事件捕获此异常时遇到此类问题,因此我创建了自己的DropDownList WebControl。然后我覆盖了 PerformDataBinding 事件。这是一般的想法:

[ToolboxData("<{0}:MyDropDownList runat=server></{0}:MyDropDownList>")]
public class MyDropDownList : DropDownList
{

    protected override void PerformDataBinding(System.Collections.IEnumerable dataSource)
    {
        try
        {
            base.PerformDataBinding(dataSource);
        }
        catch (ArgumentOutOfRangeException ex)
        {
            // Handled the exception here
        }

    }
}

此解决方案在StackOverflow here上找到。这个网站上的社区为我节省了一些严重的溃疡。非常感谢所有的帮助。