powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
25 сообщений из 37, страница 1 из 2
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38604498
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет, и хорошего дня. Давеча, я задавал вопрос про ADo.net и asp.net. Приступил к работе, осилил 2 учебника, и дело пошло, но опять таки натолкнулся на проблему заполнения DropDownList'ов в InsertItemTamplate объекта ListView. Перерыв тонну инфы в гугле уже весь измучался и понял, что пора написать сюда. Проблема в следующем, есть код события ListView1_ItemCreated, который заполняет dropdownlist'ы через sqldatareader:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
protected void ListView1_ItemCreated(object sender, ListViewItemEventArgs e)
    {
        
        DropDownList ddlForm = (DropDownList)e.Item.FindControl("EditDOUForm");
        if (ddlForm != null)
            {
                SqlConnection con = new SqlConnection(ConnectionString);
                SqlCommand cmd = new SqlCommand("DOUForm_select", con);
                cmd.CommandType = CommandType.StoredProcedure;
                con.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                ddlForm.DataSource = dr;
                ddlForm.DataTextField = "DOUForm_name";
                ddlForm.DataValueField = "DOUForm_id";
                ddlForm.DataBind();
                ddlForm.Items.Insert(0, new ListItem("", ""));
                con.Close();
        
            }


Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<asp:ListView ID="ListView1" DataSourceID="SelectDOU" runat="server" DataKeyNames="DOU_id" 
            EnableViewState="false"
            OnItemDataBound="ListView1_ItemDataBound"
            OnItemInserting="ListView1_ItemInserting"
            OnItemCreated="ListView1_ItemCreated"
            OnItemInserted="ListView1_ItemInserted"
            InsertItemPosition="FirstItem">
<InsertItemTemplate>
<asp:DropDownList runat="server" ID="EditDOUForm" AppendDataBoundItems="true" EnableViewState="false" Width="50%">
                </asp:DropDownList>
</InsertItemTemplate>
</asp:ListView>


Он падает с ошибкой "Недопустимая попытка вызвать FieldCount при закрытом устройстве чтения." Если я убираю, строку con.Close(), то все компилируется и заполняется как мне надо, НО подключение остается не закрытым! Как это обойти?
Пробовал следующее:
1) через DataSet и SqlDataAdapter:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  DropDownList ddlForm = (DropDownList)e.Item.FindControl("EditDOUForm");
        if (ddlForm != null)
        {
            SqlConnection con = new SqlConnection(ConnectionString);
            SqlCommand cmd = new SqlCommand("DOUForm_select", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(ds, "DOUForm");
            ddlForm.DataSource = ds.Tables["DOUForm"];
            ddlForm.DataTextField = "DOUForm_name";
            ddlForm.DataValueField = "DOUForm_id";
            ddlForm.DataBind();
            ddlForm.Items.Insert(0, new ListItem("", ""));
        }


Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<asp:ListView ID="ListView1" DataSourceID="SelectDOU" runat="server" DataKeyNames="DOU_id" 
            EnableViewState="false"
            OnItemDataBound="ListView1_ItemDataBound"
            OnItemInserting="ListView1_ItemInserting"
            OnItemCreated="ListView1_ItemCreated"
            OnItemInserted="ListView1_ItemInserted"
            InsertItemPosition="FirstItem">
<InsertItemTemplate>
<asp:DropDownList runat="server" ID="EditDOUForm" AppendDataBoundItems="true" EnableViewState="false" Width="50%">
                </asp:DropDownList>
</InsertItemTemplate>
</asp:ListView>


Беда с тем, что после компиляции он дублирует записи в DropDownList'ы (т. е. 1,2,3,4,1,2,3,4) а мне надо просто чтобы было 1,2,3,4. Получается он по 2 раза его заполняет и ставит пустое значение в начало. Тоже не понимаю почему так происходит?
2) Если ставлю свойство DropDownList AppendDataBoundItems="false", то он не вставляет пустую строку в начало списка :( а мне надо чтобы она обязательно вставлялась, потому что при добавлении новой записи в базу некоторые поля могут быть пустыми, а выбираются они из dropdownlist'ов.
3) Грешу на событие ItemCreated, или надо через какое то другое событие ListView заполнять данные DropdownList'ы?
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38604523
Кавказ-сила
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38604712
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4a,

ddlForm.Items.Clear();
//код заполнения
ddlForm.Items.Insert(0, new ListItem("<-выберите ответ->", "0"));

Вообще доступ и чтение данных из базы данных надо делать в другом классе а здесь только байндить данные

Должен быть
1. Класс для доступа и чтения данных из базы
2. При построении Списка уже заполнять DropDownList уже загруженными данными.
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38604713
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4a,

3) Грешу на событие ItemCreated, или надо через какое то другое событие ListView заполнять данные DropdownList'ы?

Да другое
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605057
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIT2708rpe4a,

ddlForm.Items.Clear();
//код заполнения
ddlForm.Items.Insert(0, new ListItem("<-выберите ответ->", "0"));
Вроде бы у меня стоит у Listview Appentdatabounditems = "true" - это свойство ведь обнуляет объект перед заполнением?
VIT2708Вообще доступ и чтение данных из базы данных надо делать в другом классе а здесь только байндить данные

Должен быть
1. Класс для доступа и чтения данных из базы
2. При построении Списка уже заполнять DropDownList уже загруженными данными.
Полностью согласен, но пока руки не дошли, да и опыта маловато...
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605077
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кавказ-сила http://msdn.microsoft.com/en-us/library/905keexk.aspx
А что вам не нравится в моей реализации(да возможно код не очень красив, но это я для быстроты делаю), я же написал, что пробую и через sqldatareader и через sqldataadapter? и я же написал, что знаю, как они работают, проблема в том что либо подключение он остается не закрытым и все заполняется как надо, либо появляются с sqldataadapter дублирующие записи в dropdownlist'ах и как от них избавится я не знаю... скорей всего надо событие другое использовать, но какое?
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605080
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIT2708rpe4a,
Да другое
а поточнее, пробовал через событие Listview Itemdatabound, ноль реакции...
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605088
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Допустим на 1 странице у меня есть кнопка перехода на другую страницу, которая должна добавлять новую сущность в таблицу базы данных, то есть как я понимаю автоматом вызывается событие Listview_insertingitem()? И появляются поля и Dropdownlist'ы которые я забил в <InsertItemTemplate>, далее по кнопке добавить происходит добавление записи в таблицу базы данных?
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605104
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4aVIT2708rpe4a,
Да другое
а поточнее, пробовал через событие Listview Itemdatabound, ноль реакции...

ASPX

Код: plaintext
1.
2.
3.
4.
5.
6.
<asp:ListView ID="List" runat="server" OnItemDataBound="Lv_ItemBind">
<ItemTemplate>
<asp:DropDownList runat="server" ID="EditDOUForm" AppendDataBoundItems="true" EnableViewState="false" Width="50%">
                </asp:DropDownList>
</ItemTemplate>
</asp:ListView>


CS

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
protected void lv_ItemBind(object source, ListViewItemEventArgs e)
{
  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  {
DropDownList ddlForm = (DropDownList)e.Item.FindControl("EditDOUForm");
        if (ddlForm != null)
            {
                SqlConnection con = new SqlConnection(ConnectionString);
                SqlCommand cmd = new SqlCommand("DOUForm_select", con);
                cmd.CommandType = CommandType.StoredProcedure;
                con.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                ddlForm.DataSource = dr;
                ddlForm.DataTextField = "DOUForm_name";
                ddlForm.DataValueField = "DOUForm_id";
                ddlForm.DataBind();
                ddlForm.Items.Insert(0, new ListItem("", ""));
                con.Close();
        
            }
  }
}
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605205
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIT2708,
у вас стоит заполнение в <Itemtamplate>, а у меня они заполняются в <InsertItemtemplate>, <Itemtamplate> - я вообще на данной странице не использую :( . Конечно попробовал ваш код, он выдал ошибку:
Код: c#
1.
 CS0019: Оператор "==" не может применяться к операндам типа "System.Web.UI.WebControls.ListViewItemType" и "System.Web.UI.WebControls.ListItemType"


Поясните, где возникает или когда событие ItemCreated?
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605215
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Причем данное задача реализована с помощью sqldatasource, то есть программно это тоже как то можно настроить только как :))
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605219
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4a,


Код: c#
1.
2.
3.
4.
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{

}



замените на

Код: c#
1.
2.
3.
4.
if (e.Item.ItemType == ListViewItemType.Item || e.Item.ItemType == ListViewItemType.AlternatingItem)
  {

}



Create возникает при создании новой строки, а для построения списка она не подходит
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605224
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4aПричем данное задача реализована с помощью sqldatasource, то есть программно это тоже как то можно настроить только как :))

sqldatasource это источник, а программно я вам привел функцию заполнения DDL

А как у вас это все должно выглядеть?
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605233
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIT2708
Код: c#
1.
2.
3.
4.
if (e.Item.ItemType == ListViewItemType.Item || e.Item.ItemType == ListViewItemType.AlternatingItem)
  {

}


Хитро, но к сожалению так не получится, т.к. из ListViewItemType можно выбрать только DataItem, EmptyItem, InsertItem.
Я вообще пробую так:
Код: c#
1.
if ((e.Item != null) && (e.Item.ItemType == ListViewItemType.InsertItem))


VIT2708Create возникает при создании новой строки, а для построения списка она не подходит
Вот буржуи проклятые на их форуме ведь вычитал про это событие, хотя по идее оно заполняет, только делает не нужный дубликат.
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605235
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIT2708, желательно чтобы все кодом было, вообще не хочу пользоваться этими sqldatasource и objectdatasource :))
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605237
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока реакции 0.
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605246
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4a,

Выберите DataItem, я редко работаю с LV больше с Repeater поетому есть маленькие не точности

1. Если вы хотите добавить новую запись то как по мне нужно создать отдельную форму и там добавлять.
2. В списке я бы только редактировал существующие записи

Покажите пример как это должно выглядеть, а то так трудновато понять
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605249
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4aVIT2708, желательно чтобы все кодом было, вообще не хочу пользоваться этими sqldatasource и objectdatasource :))

Сейчас попробую вам написать маленький пример
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605274
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4a,

Код: c#
1.
2.
3.
4.
5.
public class Test
{
public int ID {get; set;}
public string Title {get; set;}
}



Код: c#
1.
2.
3.
public class TestList : List<Test>
{
}



Для теста на странице в CS

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
void GetData()
{
TestList Source = new TestList();
//Если читали про ADO.NET то думаю заполните этот список

listView1.DataSource = Source;
listView1.DataBind();
}



ASPX

Код: plaintext
1.
2.
3.
4.
5.
6.
<asp:ListView ID="listView1" runat="server" OnDataBound="lv_DataBound">
<ItemTemplate>
<asp:DropDownList runat="server" ID="EditDOUForm" AppendDataBoundItems="true" EnableViewState="false" Width="50%">
                </asp:DropDownList>
</ItemTemplate>
</asp:ListView>



\в вашем случае это получается сложноватый пример

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
protected void lv_ItemBind(object sender, ListViewItemEventArgs e)
{
  if (e.Item.ItemType == ListViewItemType.DataItem)
  {
        DropDownList ddlForm = (DropDownList)e.Item.FindControl("EditDOUForm");
        if (ddlForm != null)
            {
                ddlForm.Items.Clear();
                ddlForm.DataSource = ((ListView)sender).DataSource;  // В данном случае вы заполняете данные из TestList Source = new TestList();
                ddlForm.DataBind();
                ddlForm.Items.Insert(0, new ListItem("<-выберите ответ->", "0"))
            }
  }
}



В вашем случае вам надо заполнить Выпадающий список, если я правильно понял то он будет находится в каждой строке списка?
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605316
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIT2708, опять же хочу уточнить ListViewItemType.DataItem, он будет заполнять dropdownlist'ы которые находятся у ListView <ItemTemplate> (Которого у меня на странице в принципе нету, потому что при переходе на эту страницу должно сразу вываливаться окно для добавление новой записи с TextBox'ами и DropDownList'ами), в данном случае это для меня не годится, а мне надо чтобы он заполнял DropDownlist'ы которые находятся в ListView <InsertItemTemplate>, тогда надо использовать свойство ListViewItemType.InsertItem.

Но из данного события не происходит привязки данных к DropDownList'ам, реакции 0. За пример спасибо огромное, может еще кому пригодится. А вот можно же это оформить через Repeate по идее, я просто им не разу не пользовался, это не принципиально через какой элемент я буду добавлять данную запись в базу, главное чтобы это работало :))?
Блин хотел картинки прикрутить, но не могу разобраться как это сделать :(
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605328
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4a,

Не видя как вы хотите сделать я не могу точно вам подсказать

Внизу под окном редактирования есть кнопка "Выберите файл" вот так и прикрепите картинку
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605340
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpe4aVIT2708, опять же хочу уточнить ListViewItemType.DataItem, он будет заполнять dropdownlist'ы которые находятся у ListView <ItemTemplate> (Которого у меня на странице в принципе нету, потому что при переходе на эту страницу должно сразу вываливаться окно для добавление новой записи с TextBox'ами и DropDownList'ами), в данном случае это для меня не годится, а мне надо чтобы он заполнял DropDownlist'ы которые находятся в ListView <InsertItemTemplate>, тогда надо использовать свойство ListViewItemType.InsertItem.

Но из данного события не происходит привязки данных к DropDownList'ам, реакции 0. За пример спасибо огромное, может еще кому пригодится. А вот можно же это оформить через Repeate по идее, я просто им не разу не пользовался, это не принципиально через какой элемент я буду добавлять данную запись в базу, главное чтобы это работало :))?
Блин хотел картинки прикрутить, но не могу разобраться как это сделать :(

Зачем для добавления новой записи вы "запихиваете" DropDownList внутрь ListView? вынесите его на веб страницу.
Если проект тестовый и там нет ничего секретного то можете выслать мне на e-mail я вам его переделаю как надо.
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605341
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIT2708, с sqldatasource(а они весят на каждом DDL + один весит на LV с ХП на добавление записи) работает вот так, как я и хочу:
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605351
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIT2708, теперь из под кода, если AppendDataBound="true" и используем событие ListView1_ItemCreated:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
if ((e.Item != null) && (e.Item.ItemType == ListViewItemType.InsertItem))
        {
            DropDownList ddlForm = (DropDownList)e.Item.FindControl("EditDOUForm");
            if (ddlForm != null)
            {
                SqlConnection con = new SqlConnection(ConnectionString);
                SqlCommand cmd = new SqlCommand("DOUForm_select", con);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds, "DOUForm");
                ddlForm.DataSource = ds.Tables["DOUForm"];
                ddlForm.DataTextField = "DOUForm_name";
                ddlForm.DataValueField = "DOUForm_id";
                ddlForm.DataBind();
                ddlForm.Items.Insert(0, new ListItem("", ""));
            }
        }


Получаем следующее:
...
Рейтинг: 0 / 0
Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
    #38605356
rpe4a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIT2708, если событие AppendDataBound="false" и тоже самое событие с тем же кодом имеем:
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Беда с DropDownList, Sqldatareader и cобытием ListView_ItemCreated?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]