【问题标题】:Set a DropDownList SelectedValue to a bound field with sometimes null value将 DropDownList SelectedValue 设置为有时为空值的绑定字段
【发布时间】:2013-05-21 14:41:59
【问题描述】:

我有一个网格视图,它是从允许编辑的 sql 表中填充的。对于其中一个字段,我有它,因此用户必须从 gridview 的编辑模板中的下拉框中选择一个值。

<asp:TemplateField HeaderText="Department" SortExpression="Department">
                 <EditItemTemplate>
                     <asp:DropDownList ID="ddlEditDepartment" runat="server" 
                         SelectedValue='<%# Bind("Department") %>'>
                    <asp:ListItem>Department 1</asp:ListItem>
                    <asp:ListItem>Department 2</asp:ListItem>
                    <asp:ListItem>Department 3</asp:ListItem>
                     </asp:DropDownList>
                 </EditItemTemplate>
                 <ItemTemplate>
                     <asp:Label ID="lblDepartment" runat="server" Text='<%# Bind("Department") %>'></asp:Label>
                 </ItemTemplate>
            </asp:TemplateField>

如果您为该字段已在表中存储值的记录选择“编辑”,则没有问题。但是,如果您选择“编辑”并且表格中还没有相应的值,则会出现以下错误

'ddlEditDepartment' has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value

在这种情况下我如何解释空白或空值并使其工作?

【问题讨论】:

    标签: asp.net data-binding selectedvalue


    【解决方案1】:

    您将 DropDownList 绑定到 GridView 数据源中名为“Department”的字段:

    SelectedValue='<%# Bind("Department") %>'
    

    这是一种 hack,但您可以修改填充 GridView 的 Department 字段的查询以解释空值(通过合并它们):

    SELECT COALESCE(Department, "No department entered") AS Department
    FROM YourTable
    

    然后只需将其作为“默认”选项添加到您的下拉列表中:

    <asp:ListItem>No department entered</asp:ListItem>
    

    【讨论】:

    • 我真的很喜欢这个主意,它会做我想要的。虽然在编辑 Select 语句后,我收到一个错误:DataBinding: 'System.Data.DataRowView' 不包含名称为 'Department' 的属性。 SelectCommand="SELECT ID, COALESCE(Department, 'No department'), Notes FROM Departments"
    • 我的错,您需要为该列命名,@kyle_13。 COALESCE(Department, 'No department') AS Department
    • 嗨@jadarnel27 成功了!唯一奇怪的是它不会在 Select 和 ListItem 中使用值“No department”进行更新。一旦我将其更改为 COALESCE(Department, '') 和 &lt;asp:ListItem&gt;&lt;/asp:ListItem&gt; 它就完美了。这也很好,因为我真的希望它显示空白而不是值,但很奇怪。
    • @kyle_13 这是奇怪。不过,我很高兴能在正确的方向上为您提供帮助 =)
    【解决方案2】:

    听起来您正在尝试更新不存在的记录。因此,您有几个选择,具体取决于您想要做什么。您可以捕获错误并向用户显示他们需要在编辑之前创建新记录的用户友好警报。或者,如果出现错误,您可以捕获错误并运行插入命令。或者你可以防止错误一起触发。这将是我的建议。在后面的代码中,当 dropdowlist 事件触发时,获取 ID 并运行查询以查看记录是否存在。如果是,请更新它。如果没有,要么提醒用户,要么你可以直接插入。如果您对如何执行此操作有具体问题,请告诉我。

    【讨论】:

    • 嗨@jason,谢谢。如果字段实际上为空,我基本上试图做的是在更新记录时拉入一个空的“空白”值,然后使用下拉列表中新输入的值更新记录。如果没有 jadarnel27 给出的解决方法,它会抛出错误。
    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2023-03-10
    • 2018-05-24
    • 2014-08-07
    相关资源
    最近更新 更多