Встроить Combobox в ListView?
От: leaveIIIusion  
Дата: 01.09.10 02:35
Оценка:
Здравствуйте!
Есть у меня обычный ListView. Я хочу заменить в нем TextBox'ы для редактирования на всплывающие списки, например, Combobox.
Для пробы заменил один из TextBox'ов:
<asp:TextBox ID="ProjectIDTextBox" runat="server" Text='<%# Bind("ProjectID") %>' />


Combobox'ом:
<asp:Combobox ID="ComboBox1" runat="server"
     DropDownStyle="DropDownList"
     AutoCompleteMode="SuggestAppend"
     CaseSensitive="False"
     CssClass=""
     ItemInsertLocation="Append"

     DataSourceID="SqlDataSource1" 
     SelectedValue= '<%# Bind("ProjectID") %>'
     DataTextField="ProjectID" 
     DataValueField="ProjectID">
     </asp:Combobox>



Редактор ошибок не находит, но после запуска ошибка появляется:

Методы привязки данных, например, Eval(), XPath() и Bind(), можно использовать только в контексте элемента управления с привязкой к данным.


Я тут покопал и нашел здесь статью как это вроде бы можно исправить.

как было написано в статье, я заменил строку:

SelectedValue= '<%# Bind("ProjectID") %>'


на строку:
SelectedValue= '<%# DataBinder.Bind(Container.DataItem,"ProjectID") %>'


но теперь при компиляции вылетают ошибки:

'System.Web.UI.DataBinder' не содержит определение для 'Bind'


и

"System.Web.UI.WebControls.ListViewItem" не содержит определение для "DataItem". Не удалось найти метод расширения "DataItem", принимающий первый аргумент типа "System.Web.UI.WebControls.ListViewItem" (пропущено использование директивы или ссылка на сборку?)


Там дальше ещё что-то в статье написано, но я не могу разобрать.
Подскажите как мне правильно этот всплывающий список вставить, так чтобы работало. Может у кого уже получалось так сделать, подскажите что я не так делаю.
Re: Встроить Combobox в ListView?
От: rinat.mergenbaev Россия  
Дата: 02.09.10 04:16
Оценка: 2 (1)
Здравствуйте, leaveIIIusion, Вы писали:

III>Здравствуйте!

III>Есть у меня обычный ListView. Я хочу заменить в нем TextBox'ы для редактирования на всплывающие списки, например, Combobox.
III>Подскажите как мне правильно этот всплывающий список вставить, так чтобы работало. Может у кого уже получалось так сделать, подскажите что я не так делаю.


Так

<table>
        <asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource1" DataTextField="Name" DataValueField="TermID">     
            <ItemTemplate>                    
                    <tr>
                        <td>
                            <asp:Label runat="server" ID="lbl" Text='<%# Eval("Name") %>' />
                        </td>
                        <td>
                             <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource1" DataTextField="Name" DataValueField="TermID" SelectedValue= '<%# Bind("TermID") %>'>
                            </asp:DropDownList>
                        </td>
                    </tr>                       
            </ItemTemplate>           
        </asp:ListView>    
   </table>       

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:sandboxConnectionString %>" 
        SelectCommand="SELECT DISTINCT * FROM [Terms]"></asp:SqlDataSource>
Re: Встроить Combobox в ListView?
От: Solova  
Дата: 03.11.10 10:13
Оценка:
Почему бы не использовать DropDownList?
<asp:DropDownList SelectedValue='<%# Bind("ProjectID") %>' 
                            DataSourceID="!Здесь имя Вашего SqlDataSource!" DataTextField="!Имя отображаемого поля!" 
                            DataValueField="!Имя поля, которое будет выступать значением!" ID="DropDownList" runat="server">
                        </asp:DropDownList>
Re[2]: Встроить Combobox в ListView?
От: Аноним  
Дата: 28.03.12 11:28
Оценка:
Здравствуйте, Solova, Вы писали:

S>Почему бы не использовать DropDownList?

S>
S><asp:DropDownList SelectedValue='<%# Bind("ProjectID") %>' 
S>                            DataSourceID="!Здесь имя Вашего SqlDataSource!" DataTextField="!Имя отображаемого поля!" 
S>                            DataValueField="!Имя поля, которое будет выступать значением!" ID="DropDownList" runat="server">
S>                        </asp:DropDownList>
S>


Таже проблемма как и у автора поста. Опишу проблемму:
использую VS 2010. АСП создаю страничку на которой выводятся данные из БД в ListView, при чем выводится объедененная таблица. Т.е. Имею таблицу Владельцы с полями ID, FirstName, LastName, CarID. И вторую таблицу Машины с полями ID и CarName. Теперь при редактировании записи в ListView, пытаюсь вместо выводимого TextBox для поля CarName, вывести DropDownList с данными из таблицы Машины. Получается все прекрасно до тех пор пока не пытаюсь привязывать выводимый DropDownList к редактируемой записи. А конкретно пытаюсь изменить выбранное значение списка, чтобы оно соответствовало текущему автомобилю редактируемого владельца. Вот пример кода:

<EditItemTemplate>
       <tr>...
             ...
                <td>
                       <asp:DropDownList ID="ddlCarID" runat="server" DataSourceID="SqlDataSource2" 
                              DataTextField="CarName" DataValueField="ID" Visible="true"
                              SelectedValue='<%# Bind("CarName") %>'>
                              </asp:DropDownList>
                </td>
                ...
       </tr>
</EditItemTemplate>

Если использую SelectedValue отладчик ругается выдает следующую ошибку: "Sys.WebForms.PageRequestManagerServerErrorException: 'ddlCarID' имеет SelectedValue, что недопустимо, так как этот элемент не существует в списке элементов. Имя параметра: value"
Привязать по SelectedIndex тоже не получается поскольку в выводимой таблице нет CarID а есть только CarName. Может конечно проблема возникает из-за того, что список я заполняю отдельным запросом SqlDataSource2, в то время как в ListView вывожу объдененную таблицу из SqlDataSource1. Но тогда мне собственно совсем не понятно как реализовать все одним запросом и список заполнить и в ListView вывести объедененную таблицу. Если кто-нибудь может подсказать как решить проблему буду очень признателен.
Re[3]: Встроить Combobox в ListView?
От: Аноним  
Дата: 28.03.12 11:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Solova, Вы писали:


S>>Почему бы не использовать DropDownList?

S>>
S>><asp:DropDownList SelectedValue='<%# Bind("ProjectID") %>' 
S>>                            DataSourceID="!Здесь имя Вашего SqlDataSource!" DataTextField="!Имя отображаемого поля!" 
S>>                            DataValueField="!Имя поля, которое будет выступать значением!" ID="DropDownList" runat="server">
S>>                        </asp:DropDownList>
S>>


А>Таже проблемма как и у автора поста. Опишу проблемму:

А>использую VS 2010. АСП создаю страничку на которой выводятся данные из БД в ListView, при чем выводится объедененная таблица. Т.е. Имею таблицу Владельцы с полями ID, FirstName, LastName, CarID. И вторую таблицу Машины с полями ID и CarName. Теперь при редактировании записи в ListView, пытаюсь вместо выводимого TextBox для поля CarName, вывести DropDownList с данными из таблицы Машины. Получается все прекрасно до тех пор пока не пытаюсь привязывать выводимый DropDownList к редактируемой записи. А конкретно пытаюсь изменить выбранное значение списка, чтобы оно соответствовало текущему автомобилю редактируемого владельца. Вот пример кода:

А>
А><EditItemTemplate>
А>       <tr>...
А>             ...
А>                <td>
А>                       <asp:DropDownList ID="ddlCarID" runat="server" DataSourceID="SqlDataSource2" 
А>                              DataTextField="CarName" DataValueField="ID" Visible="true"
А>                              SelectedValue='<%# Bind("CarName") %>'>
А>                              </asp:DropDownList>
А>                </td>
А>                ...
А>       </tr>
А></EditItemTemplate>
А>

А>Если использую SelectedValue отладчик ругается выдает следующую ошибку: "Sys.WebForms.PageRequestManagerServerErrorException: 'ddlCarID' имеет SelectedValue, что недопустимо, так как этот элемент не существует в списке элементов. Имя параметра: value"
А>Привязать по SelectedIndex тоже не получается поскольку в выводимой таблице нет CarID а есть только CarName. Может конечно проблема возникает из-за того, что список я заполняю отдельным запросом SqlDataSource2, в то время как в ListView вывожу объдененную таблицу из SqlDataSource1. Но тогда мне собственно совсем не понятно как реализовать все одним запросом и список заполнить и в ListView вывести объедененную таблицу. Если кто-нибудь может подсказать как решить проблему буду очень признателен.

У Вас в качестве SelectedValue байндится поле CarName, а значения (ValueField) DropDownList выбираются из поля ID. Соответственно при привязке выбранного значения (SelectedValue) оно будет искаться в источнике данных по полю ID, а не CarName. Вам бы нужно поставить SelectedValue='<%# Bind("CarID") %>', где CarID — это ID записи в DropDownList, которую нужно выбрать. В общем Вам нужно, если я правильно всё понял, сделать в запросе JOIN по полю CardID, чтобы оно было в числе полей источника данных.
Re[4]: Встроить Combobox в ListView?
От: Haldey2000  
Дата: 28.03.12 11:56
Оценка:
А>У Вас в качестве SelectedValue байндится поле CarName, а значения (ValueField) DropDownList выбираются из поля ID. Соответственно при привязке выбранного значения (SelectedValue) оно будет искаться в источнике данных по полю ID, а не CarName. Вам бы нужно поставить SelectedValue='<%# Bind("CarID") %>', где CarID — это ID записи в DropDownList, которую нужно выбрать. В общем Вам нужно, если я правильно всё понял, сделать в запросе JOIN по полю CardID, чтобы оно было в числе полей источника данных.

Вы все верно поняли. Я понял свою ошибку но пока что не вижу решения. В ListView у меня объеденненная таблица но при выводе CarID поля нет. После объеденения таблиц Владельцы и машины поле Владельцы.CarID заменяется полем Машины.CarName. Вот как выглядит запрос:

SELECT Employee.EmployerID, Employee.FirstName, Employee.LastName, Car.CarName FROM Employee INNER JOIN Car ON Employee.CarID = Car.ID



Теперь я хочу отредактировать запись, при этом имею объеденую таблицу и вместо TextBox использую DropDownList в поле CarName. DropDownList берет данные из отдельного запроса и ничего по сути не знает о редактируемой записи. Т.е. фактически он вообще получается с ней не связан. CarID у меня получается в ListView нет и как выкрутится из данной ситуаци я пока что не вижу.
Re[5]: Встроить Combobox в ListView?
От: Аноним  
Дата: 28.03.12 12:06
Оценка:
Здравствуйте, Haldey2000, Вы писали:

А>>У Вас в качестве SelectedValue байндится поле CarName, а значения (ValueField) DropDownList выбираются из поля ID. Соответственно при привязке выбранного значения (SelectedValue) оно будет искаться в источнике данных по полю ID, а не CarName. Вам бы нужно поставить SelectedValue='<%# Bind("CarID") %>', где CarID — это ID записи в DropDownList, которую нужно выбрать. В общем Вам нужно, если я правильно всё понял, сделать в запросе JOIN по полю CardID, чтобы оно было в числе полей источника данных.


H>Вы все верно поняли. Я понял свою ошибку но пока что не вижу решения. В ListView у меня объеденненная таблица но при выводе CarID поля нет. После объеденения таблиц Владельцы и машины поле Владельцы.CarID заменяется полем Машины.CarName. Вот как выглядит запрос:


H>
H>SELECT Employee.EmployerID, Employee.FirstName, Employee.LastName, Car.CarName FROM Employee INNER JOIN Car ON Employee.CarID = Car.ID
H>



H>Теперь я хочу отредактировать запись, при этом имею объеденую таблицу и вместо TextBox использую DropDownList в поле CarName. DropDownList берет данные из отдельного запроса и ничего по сути не знает о редактируемой записи. Т.е. фактически он вообще получается с ней не связан. CarID у меня получается в ListView нет и как выкрутится из данной ситуаци я пока что не вижу.


А если вот так:

SELECT Employee.EmployerID, Employee.FirstName, Employee.LastName, Car.CarName, Car.CarID FROM Employee INNER JOIN Car ON Employee.CarID = Car.ID
Re[6]: Встроить Combobox в ListView?
От: Haldey2000  
Дата: 28.03.12 12:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А если вот так:


А>SELECT Employee.EmployerID, Employee.FirstName, Employee.LastName, Car.CarName, Car.CarID FROM Employee INNER JOIN Car ON Employee.CarID = Car.ID


Это безусловно думаю поможет конечно. Но тогда мне придется тянуть за сабой хвост из скрытых данных в виде CarID. Мне бы хотелось конечно этого избежать. Но если по другому никак, то что поделать.
Re[6]: Встроить Combobox в ListView?
От: Haldey2000  
Дата: 28.03.12 12:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А если вот так:


А>SELECT Employee.EmployerID, Employee.FirstName, Employee.LastName, Car.CarName, Car.CarID FROM Employee INNER JOIN Car ON Employee.CarID = Car.ID


Вобще мне кажется что это по сути не очень корректно. Если бы я разрабатывал клиента на чистом C# я бы просто по доступному наименованию автомобиля выбрал из списка. Но насколько я понял DropDownList в ASP не дает мне такой возможности. И мне по сути либо тянуть хвост из дополнительных данных, либо в DropDownList в качестве DataValueField использовать CarName (если такое вообще возможно). Но тогда опять таки у меня возникнут проблеммы при сохранении данных. Поскольку придется искать отдельным подзапросом ID машины по заданному CarName.
Re[6]: Встроить Combobox в ListView?
От: Haldey2000  
Дата: 28.03.12 12:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А если вот так:


А>SELECT Employee.EmployerID, Employee.FirstName, Employee.LastName, Car.CarName, Car.CarID FROM Employee INNER JOIN Car ON Employee.CarID = Car.ID


Спасибо вам агромное я переделал думаю что теперь работает корректно и с точки зрения данных (нет избыточности данных на клиенте) и работоспособность отвечает требованиям.
В итоге благодоря вам я осознал как все это работает и вот что получилось:
Это DropDownList:

<asp:DropDownList ID="ddlCarID" runat="server" DataSourceID="SqlDataSource2" 
                                    DataTextField="CarName" DataValueField="CarName" Visible="true"
                                    SelectedValue='<%# Bind("CarName") %>'>
</asp:DropDownList>


Это мой запрос на выборку данных:
SELECT Employee.EmployerID, Employee.FirstName, Employee.LastName, Car.CarName FROM Employee INNER JOIN Car ON Employee.CarID = Car.ID

Это запрос на сохранение измененных данных:
UPDATE Employee SET FirstName = @FirstName, LastName = @LastName, CarID = (SELECT ID FROM Car WHERE (CarName = @CarName)) WHERE (EmployerID = @EmployerID)

Спасибо еще раз. Думаю что вы натолкнули меня на правельное решение. Проще все же добавить подзапрос при сохранении чем тянуть дополнительные скрытые данные (да и думаю безопаснее).
Re[7]: Встроить Combobox в ListView?
От: Аноним  
Дата: 28.03.12 12:56
Оценка:
Здравствуйте, Haldey2000, Вы писали:

H>Здравствуйте, Аноним, Вы писали:


А>>А если вот так:


А>>SELECT Employee.EmployerID, Employee.FirstName, Employee.LastName, Car.CarName, Car.CarID FROM Employee INNER JOIN Car ON Employee.CarID = Car.ID


H>Спасибо вам агромное я переделал думаю что теперь работает корректно и с точки зрения данных (нет избыточности данных на клиенте) и работоспособность отвечает требованиям.

H>В итоге благодоря вам я осознал как все это работает и вот что получилось:
H>Это DropDownList:

H>
H><asp:DropDownList ID="ddlCarID" runat="server" DataSourceID="SqlDataSource2" 
H>                                    DataTextField="CarName" DataValueField="CarName" Visible="true"
H>                                    SelectedValue='<%# Bind("CarName") %>'>
H></asp:DropDownList>
H>


H>Это мой запрос на выборку данных:

H>SELECT Employee.EmployerID, Employee.FirstName, Employee.LastName, Car.CarName FROM Employee INNER JOIN Car ON Employee.CarID = Car.ID

H>Это запрос на сохранение измененных данных:

H>UPDATE Employee SET FirstName = @FirstName, LastName = @LastName, CarID = (SELECT ID FROM Car WHERE (CarName = @CarName)) WHERE (EmployerID = @EmployerID)

H>Спасибо еще раз. Думаю что вы натолкнули меня на правельное решение. Проще все же добавить подзапрос при сохранении чем тянуть дополнительные скрытые данные (да и думаю безопаснее).


Обращайтесь!
Лучше всё же было использовать CarId, так как в Вашем случае может сложиться такая ситуация, что в базе будет несколько машин с одним и тем же CarName. Тогда и запрос и обновление приведёт к неоднозначности в выполнении программы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.