Asp.net System.ArgumentOutOfRangeException ListBox SelectedIndex出错

时间:2014-12-30 05:06:54

标签: c# asp.net tweetsharp

我收到此错误:

  

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

相同的代码在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ı);
        }
    }

2 个答案:

答案 0 :(得分: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);   
        }
    }
}

答案 1 :(得分:2)

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

然后,您尝试将选定的文本下拉列表同步到按钮单击处理程序后面的代码中的原始tweetid,基于数据的相对索引 - 它是两个列表框正在获得的显示不同步,另外,您没有验证用户是否选择了有效项,因此ArgumentOutOfRange例外。

虽然理论上可以使这种方法起作用,例如根据@ Dan的回答确保数据不会在每次page_load往返中丢失,并且启用ViewState,这对我来说似乎都很脆弱。

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

<强>的.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" }
};