我有以下DropDownList:
<asp:DropDownList ID="commission" class="form-control" runat="server">
<asp:ListItem Enabled="true" Text="Select Commission" Value="-1"></asp:ListItem>
<asp:ListItem Text="10%" Value="0.1"></asp:ListItem>
<asp:ListItem Text="15%" Value="0.15"></asp:ListItem>
<asp:ListItem Text="20%" Value="0.20"></asp:ListItem>
<asp:ListItem Text="25%" Value="0.25"></asp:ListItem>
</asp:DropDownList>
我正在从数据库中读取下拉列表的值。我没有将对象引用设置为对象Error的实例。 这就是我的尝试:
double com = reader.GetDouble(6);
if (com == 0.1)
{
commission.Items.FindByText("10").Selected = true; // I get the exeption here
}
else if (com == 0.15)
{
commission.Items.FindByText("15").Selected = true;
}
else if (com == 0.2)
{
commission.Items.FindByText("20").Selected = true;
}
else if (com == 0.25)
{
commission.Items.FindByText("25").Selected = true;
}
答案 0 :(得分:2)
ListItemCollection.FindByText方法比较完整字符串。它不会做部分字符串。因此10
与10%
不匹配。请参阅MSDN中的以下引用:
此方法不进行部分搜索或通配符搜索。如果使用此条件在集合中找不到项目,则返回null。
由于返回null,因此您尝试将.Selected
属性设置为true,则会收到NullReferenceException
。解决方案很简单,将%
添加到字符串中。
double com = reader.GetDouble(6);
if (com == 0.1)
{
commission.Items.FindByText("10%").Selected = true;
}
else if (com == 0.15)
{
commission.Items.FindByText("15%").Selected = true;
}
else if (com == 0.2)
{
commission.Items.FindByText("20%").Selected = true;
}
else if (com == 0.25)
{
commission.Items.FindByText("25%").Selected = true;
}
使用一堆if语句这样的语句过于冗长。您可以使用switch语句将其缩小。
switch(com)
{
case 0.1: commission.Items.FindByText("10%").Selected = true; break;
case 0.15: commission.Items.FindByText("15%").Selected = true; break;
case 0.2: commission.Items.FindByText("20%").Selected = true; break;
case 0.25: commission.Items.FindByText("25%").Selected = true; break;
}
另请注意,您可以根据值查找来简化代码。
commision.Items.FindByValue(com).Selected = true;
在将来,为了解决NullReferenceException,找出哪个对象为null(通过查看抛出异常的代码行,通常很明显),然后找出它为什么为null 。如果涉及.NET中内置的内容,请查看相关文档以确保了解其工作原理。
此外,您似乎正在使用double
进行财务问题。您应该使用decimal
。请参阅讨论here。