Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > GridView и DropDownList


Автор: ANDeath 26.2.2008, 13:18
Дорого времени. У меня есть GridView типа:

Код

<asp:GridView ID="goodsForm" runat="server" AutoGenerateColumns="False" DataSourceID="goodsListData" SelectedIndex='<%# Eval("Код_заказа") %>'>
    <Columns>
    <asp:BoundField DataField="Код_товара" HeaderText="Код_товара" SortExpression="Код_товара" />
    <asp:TemplateField HeaderText="Наименование">
        <ItemTemplate>
            <asp:DropDownList ID="namesList" DataSourceId="namesItemListData" DataTextField="Наименование" DataValueField="Код_товара" runat="server" SelectedIndex='<%# Eval("Код_товара") %>' Enabled="False"/>
        </ItemTemplate>
     </asp:TemplateField>
     <asp:BoundField DataField="Цена" HeaderText="Цена" SortExpression="Цена" DataFormatString="{0:C}" />
     <asp:BoundField DataField="Количество" HeaderText="Количество" SortExpression="Количество" />
     ..............
    </Columns>
</asp:GridView>

<asp:AccessDataSource ID="namesItemListData" runat="server" DataFile="C:\\Delsan.mdb" SelectCommand="SELECT [Код товара] AS Код_товара, [Наименование] FROM [Перечень товаров] WHERE ([Код товара] = ?)">
   <SelectParameters>
        <asp:ControlParameter ControlID="?????????????" Name="Код_товара" PropertyName="Text"  Type="Int32" />
   </SelectParameters>
</asp:AccessDataSource>


Подскажите как выставить у DropDownList атрибут SelectedIndex, или в AccessDataSource параметр для выборки, чтобы в DropDownList было выбрано соответствуещее BoundField DataField="Код_товара" наименование?

И сразу второй вопрос: почему может для BoundField DataField="Цена" не работать DataFormatString="{0:C}"

Заранее благодарен!

Автор: ANDeath 27.2.2008, 09:15
Еще прикол если поменять запрос для namesItemListData на 
"SELECT [Код товара] AS Код_товара, [Наименование] FROM [Перечень товаров]"
и соответсвенно убрать тег-параметр, то при загрузке страницы все страшно тупит и не доходит до своего логического завершения. Неужели 14 тышь записей такая большая проблема?  smile 

Автор: Mymik 27.2.2008, 10:28
Цитата(ANDeath @  26.2.2008,  13:18 Найти цитируемый пост)
И сразу второй вопрос: почему может для BoundField DataField="Цена" не работать DataFormatString="{0:C}"

наверное потому что у тебя буква "C" русская, а не английская.


Цитата(ANDeath @  26.2.2008,  13:18 Найти цитируемый пост)
Подскажите как выставить у DropDownList атрибут SelectedIndex, или в AccessDataSource параметр для выборки, чтобы в DropDownList было выбрано соответствуещее BoundField DataField="Код_товара" наименование?

К сожалению в таком месте где у тебя сейчас хранится DropDownList и AccessDataSource не получится у тебя такое вот использовать. Хотя возможно (но не берусь утверждать) если ты засунешь AccessDataSource в ItemTemplate (рядом с DropDownList) возможно тогда у тебя получится.


Цитата(ANDeath @  27.2.2008,  09:15 Найти цитируемый пост)
Неужели 14 тышь записей такая большая проблема? 
Вообще-то да, это большая таблица. Но еще, она ж запрашивается каждый раз когда у тебя биндится row у GridView. Т.е. она вообще дофига раз запрашивается. Тебе нужно кешировать этот запрос. 
По умолчанию атрибут EnableCaching равен false. А тебе надо выставить его в true и выставить CacheDuration.

Автор: ANDeath 27.2.2008, 16:40
Цитата

К сожалению в таком месте где у тебя сейчас хранится DropDownList и AccessDataSource не получится у тебя такое вот использовать. Хотя возможно (но не берусь утверждать) если ты засунешь AccessDataSource в ItemTemplate (рядом с DropDownList) возможно тогда у тебя получится.

Да вроде как получалось именно так юзать, только SelectedIndex не знаю как правильно прописать, чтобы с GridView связать.
Мне кажется, если переделать BoundField DataField="Код_товара" в TemplateField и присвоить ему id, то должна получиться связь по Eval("Код_товара"), но экспериментировать с этим буду немного поже.

Цитата

Вообще-то да, это большая таблица. Но еще, она ж запрашивается каждый раз когда у тебя биндится row у GridView. Т.е. она вообще дофига раз запрашивается. Тебе нужно кешировать этот запрос. 

Вообще, этот момент я думаю опустить, так как GridView является вложеным в FormView и на данном этапе (просмотра данных), просто добавить необходимое в запрос источника GridView.
А когда я буду запускать FormView в режим редактирования - источник для наименований товаров будет зависеть от типа продукции, т.е. выборка составит масимум 50 записей  smile 

Цитата

По умолчанию атрибут EnableCaching равен false. А тебе надо выставить его в true и выставить CacheDuration.

Можно поддробнее? EnableCaching я конечно выставил, но как быть с CacheDuration - для меня темный лес...)

Цитата

наверное потому что у тебя буква "C" русская, а не английская.

Ксожалению - английская(. Может есть другой способ выставить формат?

Автор: ANDeath 27.2.2008, 17:46
Цитата

А когда я буду запускать FormView в режим редактирования - источник для наименований товаров будет зависеть от типа продукции, т.е. выборка составит масимум 50 записей   

Тупанул, всеравно придется обращаться ко всем записям, так как чел в момент редактирования должен видеть в GridView ранее набитые наименования, а они не факт, что будут одного типа продукции.
Действительно хорошим выходом в сложивщейся ситуации может оказаться помещение в ItemTemplate источника AccessDataSource с параметром-условием на BoundField DataField="Код_товара", который в свою очередь скорее мутирует в TemplateField, чтобы связать по ID.  smile 

Автор: ANDeath 29.2.2008, 17:55
Запулить AccessDataSource в ItemTemplate получилось, на выборку работает стабильно... а вот на редактирование - бьет ошибку типа функцию Eval для Label ID="Kod" Text=Eval("Код_товара") нельзя применить.

И народ, подскажите все-таки что делать с форматом?!!

Автор: ANDeath 6.3.2008, 12:06
Партизаны!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)