【问题标题】:Asp.net System.ArgumentOutOfRangeException Error with ListBox SelectedIndex带有 ListBox SelectedIndex 的 Asp.net System.ArgumentOutOfRangeException 错误
【发布时间】:2014-12-30 05:06:54
【问题描述】:

我收到此错误:

System.ArgumentOutOfRangeException:指定的参数超出了有效值的范围。参数名称:索引。

相同的代码在 Windows 窗体应用程序中完美运行,但在 asp.net 中我看到此错误。

我的代码在这里:

public partial class Timeline : System.Web.UI.Page
    {
        TwitterService servis;
        ListBox tweetid = new ListBox();
        protected void Page_Load(object sender, EventArgs e)
        {
            servis = new TwitterService(consumer key,secret,token,token); 
            tweetid.Items.Clear();
            ListBox2.Items.Clear();
            IEnumerable<TwitterStatus> anasayfa = servis.ListTweetsOnHomeTimeline(new ListTweetsOnHomeTimelineOptions { Count = 200 });
            var gelen = servis.ListTweetsOnHomeTimeline(new ListTweetsOnHomeTimelineOptions { Count = 200, MaxId = anasayfa.Last().Id });
            foreach (var tweet in gelen)
            {
                    tweetid.Items.Add(tweet.Id.ToString());
                    ListBox2.Items.Add(tweet.Text);   
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            servis.Retweet(new RetweetOptions() { Id = long.Parse(tweetid.Items[ListBox2.SelectedIndex].ToString())});
            String uyarı = "alert('Retweetlendi!');";
            ClientScript.RegisterOnSubmitStatement(this.GetType(), "ConfirmSubmit", uyarı);
        }
    }

【问题讨论】:

  • 几乎可以肯定是tweetid.Items[ListBox2.SelectedIndex]。在将 SelectedIndex 用作索引器之前验证其值。
  • 在我看来,在 Button1_Click 时可能未填充 tweetid。是 Page_Load 里面的 foreach 循环吗?
  • @BrandonSpilove 是的,它在 page_load 中。
  • @StuartLC 我应该怎么做。就像我说的,这段代码在 Windows 窗体应用程序中很好。

标签: c# asp.net tweetsharp


【解决方案1】:

这里的问题是你有两个ListBoxes,一个(tweetid)存储推文的id(可能是一个键),另一个(ListBox2)存储推文的文本。您似乎也没有将动态创建的 tweetid ListBox 添加到页面的任何位置(可能意图是 tweetid ListBox 是隐藏的或类似的)。

然后,您尝试根据数据的相对索引,在按钮单击处理程序后面的代码中将选定的文本下拉同步存储回原始 tweetid - 显然两个列表框正在退出同步,另外,您没有验证用户是否选择了有效项目,因此出现 ArgumentOutOfRange 异常。

虽然理论上这可以工作,例如根据@Dan 的回答,通过确保数据不会在每次page_load 往返中丢失,并且还通过启用ViewState,这一切对我来说似乎相当脆弱。

我建议您改为使用单个ListBox 并使用DataTextField 向用户显示推文,并使用DataValueField 跟踪每条推文的ID:

.aspx

<asp:ListBox runat="server" ID="TweetsListBox" DataTextField="Text" DataValueField="Id" EnableViewState="True" />

.aspx.cs 后面的代码

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // Replace with your code to fetch tweets here
        TweetsListBox.DataSource = FetchSomeTweets();
        // We've alread set the names of the properties to use `Id` and `Text` in the aspx
        TweetsListBox.DataBind();
    }
}

protected void Button1_Click(object sender, EventArgs e)
{
    long tweetIdToRetweet;
    if (long.TryParse(TweetsListBox.SelectedValue, out tweetIdToRetweet))
    {
        servis.Retweet(new RetweetOptions() { Id = tweetIdToRetweet });
    }
    else
    {
        // Display Error that user must select a tweet
    }
}

出于测试目的,我为您的推文服务使用了以下模拟模型:

class Tweet
{
    public int Id { get; set; }
    public string Text { get; set; }
}

private static readonly IEnumerable<Tweet> SomeTweets = new[]
{
    new Tweet { Id = 123, Text = "This is tweet 123" },
    new Tweet { Id = 234, Text = "This is tweet 234" },
    new Tweet { Id = 345, Text = "This is tweet 345" }
};

【讨论】:

  • 非常感谢斯图尔特。这对我很有帮助。
【解决方案2】:

您的 Page_Load 方法会在每次页面回发时填充 ListBox,甚至在您的按钮单击事件之前。

因此,ListBox2.SelectedIndex 将不是用户选择的索引,因为它是在 Page_Load 方法中新填充的。

您应该在 page_load 上添加回发检查,并且仅在请求不是回发时才填充 ListBox。

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack) {
        servis = new TwitterService(consumer key,secret,token,token); 
        tweetid.Items.Clear();
        ListBox2.Items.Clear();
        IEnumerable<TwitterStatus> anasayfa = servis.ListTweetsOnHomeTimeline(new ListTweetsOnHomeTimelineOptions { Count = 200 });
        var gelen = servis.ListTweetsOnHomeTimeline(new ListTweetsOnHomeTimelineOptions { Count = 200, MaxId = anasayfa.Last().Id });
        foreach (var tweet in gelen)
        {
                tweetid.Items.Add(tweet.Id.ToString());
                ListBox2.Items.Add(tweet.Text);   
        }
    }
}

【讨论】:

  • 你确定吗?您在哪一行代码中遇到了错误?
  • 同一行; 'servis.Retweet(new RetweetOptions() { Id = long.Parse(tweetid.Items[ListBox2.SelectedIndex].ToString())});'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2019-04-16
  • 1970-01-01
相关资源
最近更新 更多