我可以不从数据绑定列表视图中删除项目吗?
我将列表视图绑定到一组用户。假设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,但它仍然呈现它。
另外,如果你在lvTest.Items[0].Visible = false;
之后RemoveAt(0)
,它实际上使第二个项目不可见,这意味着列表视图会考虑删除第一个项目,但无论如何都会呈现它。
更新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;
}
答案 0 :(得分:2)
是的,你应该可以。据我了解,数据绑定纯粹是一个填充列表视图条目的过程,因此删除后应该可以正常工作。
但是,如果这是你想要做的,数据绑定列表似乎不是正确的答案。首先获取数据,修改数据,然后使用修改后的列表填充listview;或修改数据流以反映您需要的内容 - 您说这不是一个选项。
您所说的是您希望它是数据绑定,但您没有与您需要的列表实际匹配的数据源。这意味着它不应该是数据绑定。
另一种可能有趣的可能性是使用javascript / jquery删除项目,这些项目会指示这是渲染问题还是对象问题。
答案 1 :(得分:0)
您可能需要使用以下内容重新绑定列表:
lvTest.DataBind();
答案 2 :(得分:0)
只是为了踢,尝试仅在第一页加载时绑定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);
}
答案 3 :(得分: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了。
答案 4 :(得分:0)
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();
如果您从列表视图中删除项目,它将从列表视图项目集合中删除项目,但您已经使用拳头项目将数据蒙蔽到列表视图,直到您重新绑定,这些项目将显示在列表视图中。
但是当重新绑定正在发生的事情时,它会从数据源中获取数据,而不是从列表视图项中获取数据。再次它将重新绑定拳头项目因为列表视图删除没有对数据源进行任何更改。
最好的方法是更新数据源并重新绑定它。
答案 5 :(得分:0)
我遇到过这类事情的问题。试一试(VB,但你明白了)
for i as int = lvTest.Items.count -1 to 0
lvTest.Items.RemoveAt(i)
Next
当列表中的项目必须“重新定位”时,似乎存在问题。