Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将项目添加到列表<&燃气轮机;对于已包含数据的对象,请在列表中添加重复项_C#_Wcf_Windows Phone 7 - Fatal编程技术网

C# 将项目添加到列表<&燃气轮机;对于已包含数据的对象,请在列表中添加重复项

C# 将项目添加到列表<&燃气轮机;对于已包含数据的对象,请在列表中添加重复项,c#,wcf,windows-phone-7,C#,Wcf,Windows Phone 7,我正在开发一个Windows phone应用程序,我想从我的web服务中获取前15个对象的列表,外加一个表示“加载下15个项目”按钮的额外项目,并将其绑定到列表框。在选择最后一个元素或索引(button)时,我想从列表中删除最后一个项目(按钮),然后再次调用服务以获取接下来的15个项目加上按钮项目,按钮项目将再次添加到当前列表中,而无需清除列表。当我们从列表框中选择最后一项时,同样的过程也在进行。 我的问题是我能在第一轮中正确地得到它。在第二轮中,下一个15元素被添加到列表中两次。我不知道真正的

我正在开发一个Windows phone应用程序,我想从我的web服务中获取前15个对象的列表,外加一个表示“加载下15个项目”按钮的额外项目,并将其绑定到列表框。在选择最后一个元素或索引(button)时,我想从列表中删除最后一个项目(按钮),然后再次调用服务以获取接下来的15个项目加上按钮项目,按钮项目将再次添加到当前列表中,而无需清除列表。当我们从列表框中选择最后一项时,同样的过程也在进行。 我的问题是我能在第一轮中正确地得到它。在第二轮中,下一个15元素被添加到列表中两次。我不知道真正的问题是什么。我没有得到任何错误或异常也

以下是我迄今为止所做的工作:

private void ListBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        int LastIndex=app.imgItem.Count - 1;
        if (ListBox1.SelectedIndex == LastIndex)
        {
            app.imgItem.Remove(app.imgItem[app.imgItem.Count-1]);
            proxy.SelectNextItemsCompleted += new EventHandler<ServiceReference1.SelectNextItemsCompletedEventArgs>(proxy_SelectNextItemsCompleted);
            int id = app.imgItem.Last().Id;
            proxy.SelectNextItemsAsync(categoryID, id);
        }

    }

void proxy_SelectNextItemsCompleted(object sender, ServiceReference1.SelectNextItemsCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            MessageBox.Show("Cannot load data.");
            return;
        }
        else
        {
                foreach (var item in e.Result)
                {
                    ImgData idata = new ImgData();
                    idata.CategoryID = item.CategoryID;
                    idata.ImageID = item.ImageID;
                    idata.ImageTitle = item.ImageTitle;
                    idata.Thumbnail = item.Thumbnail;
                    app.imgItem.Add(idata);
                }
        }
        ImageData btnData = new ImageData();
        btnData.CategoryID = 0;
        btnData.ImageID = 0;
        btnData.ImageTitle = "";
        btnData.Thumbnail = "Images/loadButton.jpg";
        app.imgItem.Add(btnData);
        ListBox1.ItemsSource = app.imgItem;
    }
private void ListBox1\u SelectionChanged(对象发送者,selectionchangedventargs e)
{
int LastIndex=app.imgItem.Count-1;
如果(ListBox1.SelectedIndex==LastIndex)
{
app.imgItem.Remove(app.imgItem[app.imgItem.Count-1]);
proxy.SelectNextItemsCompleted+=新事件处理程序(proxy\u SelectNextItemsCompleted);
int id=app.imgItem.Last().id;
proxy.SelectNextItemsAsync(categoryID,id);
}
}
void proxy_SelectNextItemsCompleted(对象发送方,服务引用1.SelectNextItemsCompletedEventArgs e)
{
如果(例如错误!=null)
{
MessageBox.Show(“无法加载数据”);
返回;
}
其他的
{
foreach(e.Result中的var项)
{
ImgData idata=新ImgData();
idata.CategoryID=item.CategoryID;
idata.ImageID=item.ImageID;
idata.ImageTitle=item.ImageTitle;
idata.thumboil=item.thumboil;
app.imgItem.Add(idata);
}
}
ImageData btnData=新的ImageData();
btnda.CategoryID=0;
btnda.ImageID=0;
btnda.ImageTitle=“”;
btnda.thumboil=“Images/loadButton.jpg”;
app.imgItem.Add(Btnada);
ListBox1.ItemsSource=app.imgItem;
}

看起来您正在SelectionChanged事件处理程序中注册事件处理程序,因此,SelectNextItemsCompleted处理程序可能会在第二次调用时被调用两次:

proxy.SelectNextItemsCompleted += new EventHandler<ServiceReference1.SelectNextItemsCompletedEventArgs>(proxy_SelectNextItemsCompleted);
proxy.SelectNextItemsCompleted+=新事件处理程序(proxy\u SelectNextItemsCompleted);

您可能应该在代码只运行一次的其他地方注册该事件处理程序。

在第一轮之后,您在哪里清除
SelectNextItemsCompleted
的事件注册?@dtryon我没有清除事件注册,我不知道如何做。你能帮我吗?试着用这个作为一个指针:可能,事件处理程序不需要被清除,只需要不被反复设置。我认为你说的是对的,但我不知道如何处理它。我想在选择列表的最后一项时调用“proxy.SelectNextItemsCompleted”事件处理程序。如果你有什么办法处理,请告诉我。谢谢。通过查看您的代码,它看起来像是
SelectNextItemsCompleted
是代理的回调处理程序。SelectNextItemsAsync()。这意味着您不需要(不应该)手动调用它。它将在代理执行完成时自动调用。SelectNextItemsAsync()完成执行(只要您在程序执行期间的某个时间点注册了事件处理程序)。非常感谢,我使用了一个计数器来检查是否在执行之前调用了“SelectNextItemsCompleted”。现在它工作得非常好。