正在从数据绑定列表视图中删除项目:可能存在错误

本文关键字:存在 错误 删除项目 数据绑定 列表 视图 | 更新日期: 2023-09-27 18:08:07

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

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

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

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

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

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

此外,如果在RemoveAt(0)之后执行lvTest.Items[0].Visible = false;,则实际上会使第二个项目不可见,这意味着listview认为第一个项目已删除,但无论如何都会渲染它。

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

正在从数据绑定列表视图中删除项目:可能存在错误

是的,你应该能够。据我所知,数据绑定纯粹是一个填充列表视图上的条目的过程,因此之后删除它们应该可以。

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

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

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

您可能需要使用重新绑定列表

lvTest.DataBind();

为了好玩,请尝试仅在加载第一个页面时绑定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);
}

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

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了。

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

如果您从列表视图中删除项目,它将从列表视图项目集合中删除项目。但是您已经用第一个项目对列表视图进行了数据屏蔽,在重新绑定之前,这些项目将显示在列表视图中。

但当重新绑定时,它从数据源而不是列表视图项中获取数据。同样,它将重新绑定第一个项目,因为列表视图删除时不对数据源进行任何更改。

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

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

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

当列表中的项目必须"重新定位"时,似乎会出现问题。