Похоже, здесь много ненужной работы.
Есть ли какая-то особая причина, по которой вы конвертируете предметы ListBox
в ArrayList
? Его элементы уже реализуют IEnumerable
и должны прекрасно работать как DataSource
.
Кроме того, зачем связывать данные? Вы уже перемещаете элементы из одного списка в другой с помощью метода Add
. Если здесь нет чего-то, что операция привязки данных является дорогой и совершенно ненужной.
UPDATE
Вы попросили вставить код, поэтому я собираюсь вставить часть вашего кода и обсудить его:
private void Copy(ListBox Source, ListBox Target) {
int[] selectedIndices;
ListItemCollection licCollection;
ListBox objTarget;
try
{
selectedIndices = Source.GetSelectedIndices();
licCollection = new ListItemCollection();
objTarget = new ListBox();
if (Target != null && Target.Items.Count > 0)
{
foreach (ListItem item in Target.Items)
{
objTarget.Items.Add(item);
}
Target.Items.Clear();
}
int selectedIndexLength = selectedIndices.Length;
for (int intCount = 0; intCount < selectedIndexLength; intCount++)
{
licCollection.Add(Source.Items[selectedIndices[intCount]]);
}
int collectionCount = licCollection.Count;
for (int intCount = 0; intCount < collectionCount; intCount++)
{
Source.Items.Remove(licCollection[intCount]);
if (!objTarget.Items.Contains(licCollection[intCount]))
objTarget.Items.Add(licCollection[intCount]);
}
До этого момента вы сделали почти все, что вам нужно сделать. Элементы уже добавлены в элементы управления ListBox. Когда страница отображается, Framework перебирает коллекцию ListItem и отображает соответствующий HTML для элементов. Если для элемента управления включен ViewState
, элементы будут кэшироваться для ViewState
.
Но затем вы переходите к следующему шагу:
Target.DataSource = ConvertToArrayList(objTarget);
Target.DataBind();
}
catch (Exception ex)
{
throw ex;
}
finally
{
licCollection = null;
objTarget = null;
}
}
Теперь, мое понимание привязки данных говорит мне, что эта серия операторов полностью перезаписывает все, что вы сохранили в ListItemCollection
. Таким образом, вся та работа, которую вы проделали на предыдущих этапах, уничтожена.
Далее вы вызываете функцию, ConvertToArrayList
:
private ArrayList ConvertToArrayList(ListBox Source) {
ArrayList arrayList;
try {
arrayList = new ArrayList();
foreach (ListItem item in Source.Items)
arrayList.Add(item.Text);
arrayList.Sort();
}
catch (Exception ex)
{
throw ex;
}
return arrayList;
}
Теперь, это все хорошо, но проблема в следующем: вы можете просто установить ListItemCollection
в качестве источника данных. Или, как мы показали, вы можете полностью избежать связывания данных, поскольку вы уже сами строите списки и просто отбрасываете этот вызов функции.
Похоже, вам нужно принять решение о том, хотите ли вы составить список самостоятельно или связать данные. Если вы собираетесь связать данные, очистите, как вы это делаете. Если вы не собираетесь связывать данные, избавьтесь от кода, который не является абсолютно необходимым для создания списка и управления им.
ТАКЖЕ:
Вы ловите исключение (типа Exception
, не менее) и не делаете с ним ничего, а просто отбрасываете его Если вы не собираетесь ничего делать с этим исключением, удалите
Catch
пункт. Если вы планируете перебрасывать исключение, бросьте его так, чтобы сохранить трассировку стека:
try
{
// Blahdy blahdy
} catch (Exception e)
{
throw; // Do not pass e; this preserves the stack trace.
}
Ручная установка для объектов значения NULL в предложении Finally
является отложением для более старых языков, в которых не было автоматической сборки мусора. Я бы исключил этот код, поскольку он просто загромождает тело функции и затрудняет ее чтение.
Учитывая две приведенные выше точки, вы выглядите так, как будто вы можете удалить всю Try...Catch...Finally
и просто позволить исключениям пузыриться в пищевой цепи.