【问题标题】:Removing items from databound listview : Possible bug?从数据绑定列表视图中删除项目:可能的错误?
【发布时间】:2011-09-07 17:28:47
【问题描述】:

我不能从数据绑定列表视图中删除项目吗?

我将列表视图绑定到一组用户。假设列表视图正在显示来自测试对象的名称/地址。如果我尝试如下删除第一项,它仍会显示集合中的所有记录。这没有任何好的目的。我只想知道我错过了什么。

我怀疑这是因为数据源仍然指向未更改的集合。但是如果我手动更改列表视图项目,它不应该优先吗?

protected void Page_Load(object sender, EventArgs e)
{
       lvTest.DataSource = new List<TestObj>{ obj1, obj2..}; //pseudo code
       lvTest.DataBind();

       lvTest.Items.RemoveAt(0);
}

更新 我知道这不是这样做的好方法。但是这个问题的目的是知道为什么这不起作用。

我认为这可能是列表视图控件中的错误。如果您在删除第一个项目后在调试器中检查项目计数,您可以看到实际计数减少了 1,但它仍然呈现它。

另外,如果你在RemoveAt(0) 之后执行lvTest.Items[0].Visible = false;,它实际上会使第二个项目不可见,这意味着列表视图认为第一个项目被删除但无论如何都会呈现它。

更新 2

根据要求,用于测试的标记和代码隐藏如下。

<asp:ListView ID="lvTest" runat="server" >
            <LayoutTemplate><asp:PlaceHolder ID="itemPlaceholder" runat="server" /></LayoutTemplate>
            <ItemTemplate>
                <div><%# Eval("CompanyName")%><hr /></div>
            </ItemTemplate>
            <EmptyDataTemplate><div>None</div></EmptyDataTemplate>
        </asp:ListView>


protected void Page_Load(object sender, EventArgs e)
        {
            lvTest.DataSource = GetCompanyList();

            lvTest.DataBind();

            lvTest.Items.RemoveAt(0);
}



public static List<Company> GetCompanyList()
        {
            List<Company> c = new List<Company>();

            Company c1 = new Company();
            c1.CustomerID = "2122";
            c1.ContactName = "testc1";
            c1.CompanyName = "test2";

            Company c2 = new Company();
            c2.CustomerID = "2123";
            c2.ContactName = "testc2";
            c2.CompanyName = "test2";

            c.Add(c1);
            c.Add(c2);

            return c;
        }

【问题讨论】:

  • 你在使用 mvvm 吗?在这种情况下,您可能还想发送通知。
  • 只是普通的asp.net,页面上有一个listview,代码隐藏在这个代码中。
  • 不能在绑定之前删除要删除的数据吗?
  • 你不能。它会抛出一个异常,因为在它绑定之前不会有任何项目。我试过了。如果您的意思是收藏,不,我需要以这种方式删除该项目。就像我提到的,我很好奇为什么它不起作用。
  • 只是出于好奇,您能否展示您的真实代码而不是伪代码?你能在后面显示标记和整个代码吗?如果您在数据绑定之前在 0 处删除并对此进行调试,您会看到什么?

标签: c# asp.net


【解决方案1】:

是的,您应该可以。据我了解,数据绑定纯粹是在列表视图中填充条目的过程,因此在删除它们之后应该可以工作。

但是,如果这是您想要做的,数据绑定列表似乎不是正确的答案。要么先获取数据,修改它,然后用修改后的列表填充列表视图;或修改数据流以反映您所需要的 - 您说这不是一种选择。

您的意思是您希望它是数据绑定的,但您没有与您需要的列表实际匹配的数据源。这意味着它不应该是数据绑定的。

另一种可能有趣的方法是使用 javascript/jquery 删除项目,这可能表明这是渲染问题还是对象问题。

【讨论】:

  • 你的第一行是我的想法,我很困惑为什么它不起作用。关于你的第二点,我同意你所说的。但我有一个奇怪的场景,我需要根据某些条件在数据绑定后删除特定项目。忘记需要,我只是想了解为什么这不起作用。我同意这不是正确的方法。
  • 好的,我接受这一点,但有时当某些东西不能正常工作时,这表明设计是错误的,但我接受你的观点。另一个解决方案已添加到我的答案中。
【解决方案2】:

您可能需要重新绑定列表:

lvTest.DataBind();

【讨论】:

  • 如果 OP 正在从数据源中删除该项目,这将起作用,但看起来它正在从 ListView 中删除。
【解决方案3】:

只是为了好玩,尝试仅在第一个页面加载时绑定 ListView。

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        lvTest.DataSource = new List<TestObj>{ obj1, obj2 ..};
        lvTest.DataBind();
    }

    lvTest.Items.RemoveAt(0);
}

【讨论】:

  • 它应该出现在第一个页面加载中。此页面上没有回发操作。
【解决方案4】:

您是否尝试将其从数据源中删除?

List<TestObj> l = lvTest.DataSource;
l.RemoveAt(0);

我认为您不能直接从列表视图中删除项目 - 它们必须从绑定的数据源中删除。

另一种填充列表框的方法是使用循环并将其添加到项目中:

    List<string> l = new List<string>{"A", "B", "C"};
    //this.listBox1.DataSource = l;
    foreach (string s in l)
    {
        this.listBox1.Items.Add(s);
    }

您现在应该可以使用 RemoveAt 了。

【讨论】:

    【解决方案5】:
    List data = new List<TestObj>{ obj1, obj2..}; //pseudo code
    lvTest.DataSource = data;
    lvTest.DataBind();
    // if you want to remove, remove from data source and rebind 
    data.RemoveAt(0)
    lvTest.DataSource =data;
    lvTest.DataBind();
    

    如果您从列表视图中删除项目,它将从列表视图项目集合中删除项目,但您已经对第一个项目的列表视图视而不见,直到您重新绑定,这些项目将显示在列表视图中。

    但是当重新绑定时,它会从数据源而不是列表视图项中获取数据。再次它将重新绑定拳头项目,因为列表视图删除没有对数据源进行任何更改。

    最好的方法是更新数据源并重新绑定它。

    【讨论】:

    • 我知道我可以从源代码中删除它,但很好奇为什么它不能直接用于列表视图。
    【解决方案6】:

    我遇到过这类事情的问题。试试这个(VB 但你明白了)

    for i as int = lvTest.Items.count -1 to 0
    lvTest.Items.RemoveAt(i)
    Next
    

    当列表中的项目必须“重新定位”自己时,似乎存在问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多