绑定asp:DropDownList SelectedValue到布尔值不起作用 - 任何解决方法?

时间:2014-01-03 22:16:48

标签: c# asp.net asp.net-4.5

我们的UX团队不喜欢处理布尔值的复选框 - 他们想要一个asp:DropDownList,它有两个true / false选项。

我的bool必须使用<%#Bind(“”)%>绑定,因为它位于asp:GridView的编辑模板中。

这是我的代码:

<asp:GridView ...>
    ...
    <Columns>
        ...
        <asp:TemplateField ...>
            ...
            <EditItemTemplate>
                <asp:DropDownList ID="ExcludedDropDown" runat="server" SelectedValue='<%# Bind("IsExcluded") %>'>
                    <asp:ListItem Value="false" Text="Include" meta:resourcekey="ListItemResource0"></asp:ListItem>
                    <asp:ListItem Value="true" Text="Exclude" meta:resourcekey="ListItemResource1"></asp:ListItem>
                </asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>
        ...
    </Columns>
</asp:GridView>

在EditItemTemplate中有一个断点,我试着在即时窗口中跟踪:

Eval("Exclude")
false

“假”是Eval的结果。为了好的措施,我确实尝试将我的“真实”项目的值更改为:“True”,“T”,“t”,“Y”,“y”,“ - 1”,“0”,“ 1“,”“ 所有产生相同的例外:

  

'DropDownList'的选择值无效,因为它在项目列表中不存在。

我尝试使用“OnDataBinding”事件,但这根本没有帮助我(也许我做错了)。

我不想在我们的类中添加一个属性,将bool转换为字符串/整数(因为它可以立即工作)。

是不可能将bool绑定到DropDownList - 如果是,为什么在ASP.NET中有这个限制是有意义的?很难看到支持整数和DropDownList中的布尔值之间的区别。

2 个答案:

答案 0 :(得分:5)

我更改 ListItem 以大写(True | False)开头,它运行正常。你可能想尝试一下。

enter image description here

<asp:DropDownList ID="ExcludedDropDown" runat="server" 
    SelectedValue='<%# Bind("IsExcluded") %>'>
    <asp:ListItem Value="True" Text="Include"></asp:ListItem>
    <asp:ListItem Value="False" Text="Exclude"></asp:ListItem>
</asp:DropDownList>

以下是我测试

的方法
public class Something
{
    public string Some { get; set; }
    public bool IsExcluded { get; set; }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        var collections = new List<Something>
        {
            new Something {Some = "One", IsExcluded = true},
            new Something {Some = "Two", IsExcluded = false},
        };
        GridView1.DataSource = collections;
        GridView1.DataBind();
    }
}

答案 1 :(得分:1)

谢谢你的回答!知道“正确”的方法缩小了我的搜索范围以找到实际的错误。错误地,meta:resourcekey被映射(通过我们的翻译工具)来处理Value。删除meta:resourcekey属性并更改为大写的True / False解决了它。以下是应用了更改的新代码:

<asp:GridView ...>
    ...
    <Columns>
        ...
        <asp:TemplateField ...>
            ...
            <EditItemTemplate>
                <asp:DropDownList ID="ExcludedDropDown" runat="server" SelectedValue='<%# Bind("IsExcluded") %>'>
                    <asp:ListItem Value="False" Text="Include" ></asp:ListItem>
                    <asp:ListItem Value="True" Text="Exclude" ></asp:ListItem>
                </asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>
        ...
    </Columns>
</asp:GridView>