【问题标题】:FindByValue on ASP.NET DropDownListASP.NET DropDownList 上的 FindByValue
【发布时间】:2011-05-18 01:11:38
【问题描述】:

我在包含名为 ddlAggerationUnitId 的 DropDownList 的自定义用户控件中有以下代码。 DropDownList 在 Page_Load() 事件上是 DataBind'd。 “值”设置为 40 并且它确实存在。如果我删除了 set 方法的逻辑,页面将加载并选择正确的项目,但如果该值是虚假的,则页面将引发异常。我想通过在尝试设置它之前查看该值是否存在来避免该异常,因此为什么需要该逻辑。

现在看起来编译器将 if 语句评估为假,尽管我知道它应该是真的。

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

任何帮助将不胜感激!谢谢!

编辑:这是我的 Page_Load() 事件:

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

【问题讨论】:

  • 我们可以看到您的 Page_Load 您设置值和数据绑定的位置吗?
  • 用 try catch 包围它,并在 catch ddlAggerationUnitId.SelectedValue = -1 中执行此操作。只是一种解决方法。
  • 修改了上面的问题以包括 Page_Load。
  • 下拉列表是否为 NULL,因为它试图在 DataBind 之前设置 SelectedValue?

标签: c# asp.net drop-down-menu selecteditem


【解决方案1】:

以下代码目前有效,但是我认为两次 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();
        }
    }
}

【讨论】:

    【解决方案2】:

    看看下面的代码对你有没有帮助

    更新页面加载

    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();
            }
        }
    }
    

    【讨论】:

    • 否,ddlAggerationUnitId.Items.FindByValue(value.ToString()) 仍为 null。
    • 仍然没有正确设置 SelectedValue。
    • 如果我在 ListItem item = null 上面添加以下行,它可以工作:BindDdlAggerationUnitId(); ddlAggerationUnitId.SelectedIndex = -1;
    【解决方案3】:

    Page_Load 应该是:

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

    【讨论】:

    • 你是对的!改了,还是没有解决我的问题。我开始认为 DataBinding 发生在 FindByValue() 之后,因此该语句的计算结果为 null。
    • 很有可能,什么代码在请求它,在哪里?这是个大问题。我还建议将绑定逻辑移至 Page_Init。
    【解决方案4】:

    只是一个解决方法:

    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;
     }
    }
    }
    

    【讨论】:

    • 不能在下面的 -1 上将类型“int”隐式转换为“string”。
    猜你喜欢
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多