正在从数据绑定列表视图中删除项目:可能存在错误
本文关键字:存在 错误 删除项目 数据绑定 列表 视图 | 更新日期: 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
当列表中的项目必须"重新定位"时,似乎会出现问题。