Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 CheckBoxList  [new]
Yuliaa
Member

Откуда:
Сообщений: 7
У меня есть DataGrid, в него вложен DataList с шаблоном CheckBoxList. Мне нужно все выделенные записи в CheckBoxList сохранить в базу данных. Выделяю, и начинаю сохранять, при сохранении просматриваю весь CheckBoxList таким образом:

for i:=0 to count_grid-1 do begin
for n:=0 to (dgParent.Items.Item.FindControl('dlChild') as DataList).Items.Count - 1 do
begin
if (((dgParent.Items.Item.FindControl('dlChild') as DataList).Items.Item[n].FindControl('cb')) as CheckBoxlist).Items.Item[n].Selected then
begin
//добавление в базу
end;
end;


Первый элемент сохраняется и цикл проходит нормально, а когда переходит к следующему элементу, количество CheckBoxList.Items.Count становится равным нулю.
Помогите пожалуйста! Как сделать чтобы элементы CheckBoxList не исчезали?
2 сен 04, 14:24    [929619]     Ответить | Цитировать Сообщить модератору
 Re: CheckBoxList  [new]
Sa
Member

Откуда: Ekaterinburg
Сообщений: 4019
А если так попробывать?
...
xxx =  (dgParent.Items.Item.FindControl('dlChild') as DataList).Items.Count - 1
for n:=0 to xxx do
....

uid = Sa
2 сен 04, 14:32    [929664]     Ответить | Цитировать Сообщить модератору
 Re: CheckBoxList  [new]
Yuliaa
Member

Откуда:
Сообщений: 7
Ошибка то вот в этой строке, т.е. CheckBoxList.Items.count = 0
Ошибка такая:

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

Source Error:

Line 477: if (((dgParent.Items.Item.FindControl('dlChild') as DataList).Items.Item[n].FindControl('cb')) as CheckBoxList).Items.Item[n].Selected then
Line 478: begin
2 сен 04, 14:56    [929803]     Ответить | Цитировать Сообщить модератору
 Re: CheckBoxList  [new]
profil
Member

Откуда: Москва
Сообщений: 1713
у CheckBoxList есть свойство CheckedItems.
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/cpref/html/frlrfSystemWindowsFormsCheckedListBoxClassCheckedIndicesTopic.htm
private void WhatIsChecked_Click(object sender, System.EventArgs e) {
    // Display in a message box all the items that are checked.

    // First show the index and check state of all selected items.
    foreach(int indexChecked in checkedListBox1.CheckedIndices) {
        // The indexChecked variable contains the index of the item.
        MessageBox.Show("Index#: " + indexChecked.ToString() + ", is checked. Checked state is:" +
                        checkedListBox1.GetItemCheckState(indexChecked).ToString() + ".");
    }

    // Next show the object title and check state for each item selected.
    foreach(object itemChecked in checkedListBox1.CheckedItems) {

        // Use the IndexOf method to get the index of an item.
        MessageBox.Show("Item with title: \"" + itemChecked.ToString() + 
                        "\", is checked. Checked state is: " + 
                        checkedListBox1.GetItemCheckState(checkedListBox1.Items.IndexOf(itemChecked)).ToString() + ".");
    }

}
2 сен 04, 15:32    [929996]     Ответить | Цитировать Сообщить модератору
 Re: CheckBoxList  [new]
Max Pro
Member

Откуда: планета Сатурн, межгалактическая станция №999
Сообщений: 2776
По одному элементу не желательно сохранять. Сохранять надо массив. Правда Аксес не позволяет сохранять массивы, зато ежели ты работаешь с SQL-сервером или Oracle, то там можно построить запрос (всего один), сохраняющий в БД весь массив данных. Почему у тебя обнуляется число элементов, я не знаю, возможно это связано с тем чёрным ящиком, который представляет из себя процедура сохранения в БД.
Итак, раскладываю по полочкам:
1. Ты пишешь судя по коду на Паскале (или как сейчас модно его называть Дельфи). Я не знаю, поддерживает ли Паскаль объектный тип данных, но он поддерживает тип "запись".Вот и создай массив элементов типа "запись". Заполни его в цикле:
program abc (input,output);
var
array1[1..CheckBoxList.Items.Count] :record(не помню как выглядит описание типа рекорд);
i:integer;
imax:integer;
sqlString:text;
begin
imax:=CheckBoxList.Items.Count
for i:=1 to imax
if CheckBoxList.Items[i-1].selected=true then
{заполнение массива}
next i;
sqlString:="insert into ..."
{процедура подключения к БД};
{процедура взятия запроса SQL};
{процедура отключения от БД}
end.
2. Я прошу прощения, уже 10 лет не работал с Паскалем, забыл всё нафиг, помню только, что в 5-й версии отменили запрет ставить точку с запятой перед end. Короче предлагаю сперва массив заполнить, потом сделать строку запроса SQL, а потом осуществить запрос. Так как построчно брать запросы слишком медленно.
Max Pro
2 сен 04, 15:32    [929998]     Ответить | Цитировать Сообщить модератору
 Re: CheckBoxList  [new]
profil
Member

Откуда: Москва
Сообщений: 1713
слажал... не заметил родной паскаль
2 сен 04, 15:43    [930070]     Ответить | Цитировать Сообщить модератору
 Re: CheckBoxList  [new]
Yuliaa
Member

Откуда:
Сообщений: 7
Большое спасибо за ответы! Буду разбираться
2 сен 04, 15:44    [930072]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить