【问题标题】:GridView DropDownList, handling null valuesGridView DropDownList,处理空值
【发布时间】:2014-01-08 22:19:46
【问题描述】:

我意识到有人问过这个问题的变体,我已经在这里和其他地方尽职尽责地研究了几十个,但到目前为止我无法找到解决方案。希望我只是错过了一些东西,这个优秀社区中的某个人可以帮助我。我已经阅读并尝试了 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>

好的,如果在创建 Shipment 期间未输入 Truck(常见),DropDownList 会很好地填充“(Select)”作为选定项。

但是,如果一个 Shipment 引用了一辆卡车,并且该卡车后来被删除(假设它被毁坏并且不再是车队的一部分),那么我就会遇到问题并得到一个“ddlTruck 有一个无效的 SelectedValue因为它不存在于项目列表中。参数名称:值”错误消息。

最好我想阻止这个异常,这样它就不会发生。但是,如果我必须,有没有办法捕捉这个异常并“修复”DDL,以便可以显示页面并且用户可以继续他们的方式?我将如何/在哪里抓住这个?所以,我想我的问题是:

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

澄清一下,要求 DDL 保留已删除卡车的数据。只需显示“Select”、空字符串或任何默认值即可。这样做的目的是不让页面崩溃,并且用户应该能够在需要时编辑货件的其他详细信息。

任何帮助将不胜感激。我已经在这上面花了几天时间,但一直没有任何工作!如果我可以提供更多信息,或者我在帖子中不清楚,请告诉我。

非常感谢!

【问题讨论】:

  • 那么货物是否需要保留卡车不再存在的价值,还是应该更新?我假设您希望页面加载,然后用户将使用当前有效的选择更新该 DDL?这是正确的吗?
  • GridView/page 不要求保留之前的值。显示一个空字符串或其他一些默认值就可以了,因为这不是必填字段(在 GridView 或数据库表本身中)。

标签: asp.net gridview data-binding


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的建议! DropDownLists 是 GridView 的 Edit 模板的一部分,因此我认为它在 Page_Load() 中没有任何价值,因为当时控件不存在?我一直试图在 GridView 上找到一个好的事件来进行这样的检查,但到目前为止,这些事件要么太早(RowEditing - 尚未填充控件),要么我在事件运行之前得到异常(行数据绑定)。
【解决方案2】:

好的,幸好继续搜索找到了解决方案。由于我在通过 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 上找到的。这个网站上的社区为我挽救了一些严重的溃疡。非常感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多