I have a page with a few controls, add and remove buttons, a text entry box, and a listbox. The listbox gets entries from a database:
I add items and remove them when the buttons are clicked.
Also, here is the listbox (I did the enableviewstate thing because one other person's solution said to, but it hasn't changed anything.):
<asp:ListBox EnableViewState="true" ID="lstCompaniesAdded" runat="server" Width="459" Height="350" ReadOnly="true" ></asp:ListBox>
The problem isn't really in remove, it doesn't matter where I try to grab the index. I currently have the listbox set to only allow single selections. It works fine when nothing is added to the list before deleting. If the page loads and there are four items, the selected index is always correct. If I start adding values, then the index will be the oldest item added. For example:
List at first: 0 1 2 3
I add 4 and 5: 0 1 2 3 4 5
I select 5 and hit delete-> 0 1 2 3 5 four is gone.
Next it will delete 5, no matter what I pick.
If the list was empty, and then I added values, it will always delete the oldest.
I've seen a lot of people with similar problems, but I have yet to find a solution that works for me too.
Thank you very much.
Code:
protected void Page_Load(object sender, EventArgs e)
{
source = new DetailsDataSource();
if (!Page.IsPostBack)
{
//Add companies to the list
companies = DetailsDataSource.getByDetailNameandId(new int[] { 0 }, "company_name");
ArrayList CompanyList = new ArrayList();
foreach (DetailsObject detail in companies)
{
CompanyList.Add(detail.DetailValue);
//lstCompaniesAdded.Items.Add(new ListItem(detail.DetailValue, detail.DetailName));
}
lstCompaniesAdded.DataSource = CompanyList;
lstCompaniesAdded.DataBind();
}
}
I add items and remove them when the buttons are clicked.
Code:
protected void AddCompany(object sender, ImageClickEventArgs e)
{
if (companyDetail.Text == "")
{
EntryError.Text = "Please type in detail information.";
EntryError.Visible = true;
return;
}
DetailsObject entry = new DetailsObject();
entry.DetailValue = companyDetail.Text;
entry.DetailName = "company_name";
entry.SigID = 0;
if (source.Insert(entry))
{
// Move the detail from the entry box to the read-only box
lstCompaniesAdded.Items.Add(new ListItem(entry.DetailValue, entry.DetailName));
companyDetail.Text = "";
EntryError.Visible = false;
}
else
{
EntryError.Text = "That entry already exists.";
EntryError.Visible = true;
}
}
protected void RemoveCompany(object sender, ImageClickEventArgs e)
{
ArrayList list = new ArrayList();
list.AddRange(lstCompaniesAdded.GetSelectedIndices());
if (lstCompaniesAdded.SelectedIndex > -1)
{
DetailsObject entry = new DetailsObject();
int total = lstCompaniesAdded.Items.Count;
for (int i = 0; i < total; i++)
{
if (list.Contains(i))
{
list.Remove(i);
entry.DetailValue = lstCompaniesAdded.Items[i].Text;
entry.DetailName = "company_name";
entry.SigID = 0;
if (source.Delete(entry.DetailValue, entry.DetailName))
{
lstCompaniesAdded.Items.RemoveAt(i);
i--;
total--;
}
else
{
this.EntryError.Text = "That entry could not be found.";
this.EntryError.Visible = true;
}
}
}
}
}
Also, here is the listbox (I did the enableviewstate thing because one other person's solution said to, but it hasn't changed anything.):
<asp:ListBox EnableViewState="true" ID="lstCompaniesAdded" runat="server" Width="459" Height="350" ReadOnly="true" ></asp:ListBox>
The problem isn't really in remove, it doesn't matter where I try to grab the index. I currently have the listbox set to only allow single selections. It works fine when nothing is added to the list before deleting. If the page loads and there are four items, the selected index is always correct. If I start adding values, then the index will be the oldest item added. For example:
List at first: 0 1 2 3
I add 4 and 5: 0 1 2 3 4 5
I select 5 and hit delete-> 0 1 2 3 5 four is gone.
Next it will delete 5, no matter what I pick.
If the list was empty, and then I added values, it will always delete the oldest.
I've seen a lot of people with similar problems, but I have yet to find a solution that works for me too.
Thank you very much.