C# ASP.NET DropDownList上的FindByValue

C# ASP.NET DropDownList上的FindByValue,c#,asp.net,drop-down-menu,selecteditem,C#,Asp.net,Drop Down Menu,Selecteditem,我在一个自定义用户控件中有以下代码,该控件包含一个名为ddlAggerationUnitId的DropDownList。DropDownList在Page_Load()事件上进行数据绑定。“值”设置为40,并且它确实存在。如果我删除set方法的逻辑,页面将加载并选择正确的项,但是如果值是假的,页面将抛出异常。我希望在尝试设置该值之前先查看该值是否存在,从而避免该异常,因此,逻辑是必要的 现在看起来编译器将if语句计算为false,尽管我知道事实上它应该为true public long? Val

我在一个自定义用户控件中有以下代码,该控件包含一个名为ddlAggerationUnitId的DropDownList。DropDownList在Page_Load()事件上进行数据绑定。“值”设置为40,并且它确实存在。如果我删除set方法的逻辑,页面将加载并选择正确的项,但是如果值是假的,页面将抛出异常。我希望在尝试设置该值之前先查看该值是否存在,从而避免该异常,因此,逻辑是必要的

现在看起来编译器将if语句计算为false,尽管我知道事实上它应该为true

public long? Value
{
    get { return Int64.Parse(ddlAggerationUnitId.SelectedItem.Value); }
    set
    {
        if (ddlAggerationUnitId.Items.FindByValue(value.ToString()) != null)
        {
            ddlAggerationUnitId.SelectedValue = value.ToString();
        }
    }
}
任何帮助都将不胜感激!谢谢

编辑:这是我的页面加载()事件:


看看下面的代码是否对您有帮助

更新的页面加载

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BindDdlAggerationUnitId();
    }
}

private void BindDdlAggerationUnitId()
{
    ddlAggerationUnitId.DataSource = ExternalAccount.GetAggregationUnits();
    ddlAggerationUnitId.DataTextField = "Value";
    ddlAggerationUnitId.DataValueField = "Key";
    ddlAggerationUnitId.DataBind();
}



public long? Value
{
    get { return Int64.Parse(ddlAggerationUnitId.SelectedItem.Value); }
    set
    {
        ListItem item = null;
        if (value.HasValue && ddlAggerationUnitId.Items.Count > 0 && ddlAggerationUnitId.SelectedIndex > 1)
            item = ddlAggerationUnitId.Items.FindByValue(value.ToString());
        if ( item != null)
        {
            ddlAggerationUnitId.SelectedValue = value.ToString();
        }
    }
}

只是一个变通办法:

public long? Value
{
get { return Int64.Parse(ddlAggerationUnitId.SelectedItem.Value); }
set
{
 try 
 {
    if (ddlAggerationUnitId.Items.FindByValue(value.ToString()) != null)
    {
        ddlAggerationUnitId.SelectedValue = value.ToString();
    }
 }
 catch 
 {
 ddlAggerationUnitId.SelectedIndex = -1;
 }
}
}
页面加载应为:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
       ddlAggerationUnitId.DataSource = ExternalAccount.GetAggregationUnits();
       ddlAggerationUnitId.DataTextField = "Value";
       ddlAggerationUnitId.DataValueField = "Key";
       ddlAggerationUnitId.DataBind();
    }
}

下面的代码目前可以工作,但是我认为数据绑定两次有点奇怪。这证实了我先前的怀疑,即数据是在FindByValue()之后绑定的

有人对如何清理这段代码有什么想法吗

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BindDdlAggerationUnitId();
    }
}

private void BindDdlAggerationUnitId()
{
    ddlAggerationUnitId.DataSource = SIGOpsGUI.App_Code.Business.ExternalAccount.GetAggregationUnits();
    ddlAggerationUnitId.DataTextField = "Value";
    ddlAggerationUnitId.DataValueField = "Key";
    ddlAggerationUnitId.DataBind();
}


public long? Value
{
    get { return Int64.Parse(ddlAggerationUnitId.SelectedItem.Value); }
    set
    {
        BindDdlAggerationUnitId();
        ddlAggerationUnitId.SelectedIndex = -1;
        ListItem item = ddlAggerationUnitId.Items.FindByValue(value.ToString());
        if (item != null)
        {
            ddlAggerationUnitId.SelectedValue = value.ToString();
        }
    }
}

我们可以看到您正在设置值和数据绑定的页面吗?用try-catch将其包围,并在catch-ddlAggerationUnitId中执行此操作。SelectedValue=-1。只是一个解决方法。上面的问题已编辑,以包括页面加载。下拉列表是否为空,因为它试图在数据绑定之前设置SelectedValue?否,ddlAggerationUnitId.Items.FindByValue(value.ToString())仍然计算为null。仍然没有正确设置SelectedValue。如果我在ListItem item=null上方添加了以下行,它将起作用:binddlaggerationUnitId();ddlAggerationUnitId.SelectedIndex=-1;无法在下面的-1上将类型“int”隐式转换为“string”。你说得对!改变了,仍然不能解决我的问题。我开始认为数据绑定是在FindByValue()之后发生的,因此该语句的计算结果为null。很可能是什么代码在请求它,以及在哪里?这是个大问题。我还建议将绑定逻辑移到Page_Init。
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BindDdlAggerationUnitId();
    }
}

private void BindDdlAggerationUnitId()
{
    ddlAggerationUnitId.DataSource = SIGOpsGUI.App_Code.Business.ExternalAccount.GetAggregationUnits();
    ddlAggerationUnitId.DataTextField = "Value";
    ddlAggerationUnitId.DataValueField = "Key";
    ddlAggerationUnitId.DataBind();
}


public long? Value
{
    get { return Int64.Parse(ddlAggerationUnitId.SelectedItem.Value); }
    set
    {
        BindDdlAggerationUnitId();
        ddlAggerationUnitId.SelectedIndex = -1;
        ListItem item = ddlAggerationUnitId.Items.FindByValue(value.ToString());
        if (item != null)
        {
            ddlAggerationUnitId.SelectedValue = value.ToString();
        }
    }
}