Как связать данные в раскрывающемся списке в виде таблицы из таблицы базы данных, используя VB? - PullRequest
2 голосов
/ 04 декабря 2009

Таким образом, в этом виде сетки есть столбец для статуса, и я хочу, чтобы при нажатии кнопки редактирования отображался выпадающий список с сообщениями «Пуск», «Ожидание», «Неудача» Эти значения уже находятся в таблице, поэтому мне нужно как-то связать эту таблицу с каждым ddl для каждой строки.

Вот столбец из сетки. Как вы можете видеть, я хотел бы иметь метку, показывающую, когда не в режиме редактирования, и ddl, когда кнопка редактирования нажата

    <asp:TemplateField HeaderText="During Production Status" SortExpression="DuringProductionStatus">
        <EditItemTemplate>
             <asp:DropDownList ID="ddlStatus" runat="server" datavaluefield="Name" 
                 datatextfield="Name" DataSource="*What goes here?*"> />
        </EditItemTemplate>
        <ItemTemplate>
            <asp:Label ID="lblStatus" runat="server"
                Text='I don't understand how to get this from the ddl' />
        </ItemTemplate>
    </asp:TemplateField>

Для ясности моя таблица называется Status, а база данных называется DirectImport

Ответы [ 4 ]

4 голосов
/ 05 декабря 2009

Здесь нужно пройти несколько шагов - ни один из них не является особенно сложным, но они могут быть немного беспокойными (ИМХО). Хорошая новость заключается в том, что, как только вы запустите эту работу один раз, вам будет легче сделать это снова!

Я предполагаю, что у вас есть <asp:*DataSource> элемент управления на вашей странице - я предпочитаю ObjectDataSource, но я не думаю, что это имеет значение, я думаю, что SqlDataSource работает одинаково хорошо. Я никогда не пытался сделать это с GridView.DataSource = MyDataSet в коде позади, поэтому я не знаю, сработает ли это или нет, но я предполагаю, что это не так, поскольку вы не получите правильную двустороннюю привязку что ты хочешь. Этот источник данных снабжает вашу сетку вашими основными данными. Ключевым моментом здесь является то, что ваш запрос к базе данных должен возвращать как текстовое поле Статус, так и идентификатор статуса.

Таким образом, ваш gridview теперь будет выглядеть примерно так:

<asp:objectdatasource runat="server" id="MainDataSource" ... />  
<asp:gridview runat="server" id="MyGridView" DataSourceID="MainDataSource">  
    <Columns>  
        <asp:TemplateField HeaderText="During Production Status" SortExpression="DuringProductionStatus">  
            <ItemTemplate>  
                <asp:Label ID="lblStatus" runat="server"  
                   Text="<%# Bind('Status') %>" />  
           </ItemTemplate>  
        </asp:TemplateField>  
     </Columns>  
</asp:gridview>  

Text="<%# Bind('Status') %>" - это бит, который вам не хватает, чтобы получить текст статуса в сетку.

Теперь добавьте второй источник данных в вашу разметку, который считывает набор значений из таблицы Status.

<asp:objectdatasource runat="server" id="StatusObjectDataSource" ... />

И добавьте EditItemTemplate в GridView, который связан с источником данных состояния.

<EditItemTemplate>
    <asp:DropDownList ID="ddlStatus" runat="server" datavaluefield="StatusID" 
        datatextfield="Status" DataSourceID="StatusObjectDataSource"  
        SelectedValue="<%# Bind('StatusId') %>" />
</EditItemTemplate>

SelectedValue="<%# Bind('StatusId') %>" - это то, что соединяет два набора данных, так что когда вы переворачиваете строку в режим редактирования, в выпадающем списке уже выбран правильный элемент, а когда вы сохраняете его, вы получаете идентификатор статуса, который нужно поместить в ваша база данных.
И все готово.

2 голосов
/ 05 декабря 2009

Я использовал событие RowDataBound. Вот небольшой фрагмент кода. НТН

вы бы имели шаблон ItemTemplate в aspx / ascx

<asp:TemplateField HeaderText="Column Headings">
                <ItemTemplate>
                  <asp:DropDownList ID="ddlName" runat="server" Width="150"></asp:DropDownList>
                </ItemTemplate>
              </asp:TemplateField>

и в вашем коде позади, у вас будет

protected void grdDataMap_RowDataBound(object sender, GridViewRowEventArgs e) 
{

    if (e.Row.RowType == DataControlRowType.DataRow)
    {
       DropDownList ddl = (DropDownList)e.Row.FindControl("ddlName");
       ddl.DataSource = someList;//the source of your dropdown
      ddl.DataBind();

    }

}

поэтому, когда вы связываете свою сетку с помощью grdDataMap.Databind (при условии, что ваш идентификатор сетки - grdDataMap), для каждой строки будет вызываться событие привязки строки данных (включая верхний / нижний колонтитул, и поэтому вы проверяете RowType)

так что вы, вероятно, сможете решить, какие элементы управления / столбцы скрыть / показать / связать в этом событии с привязкой к строке

0 голосов
/ 04 декабря 2009

Очень быстрое решение - создать собственный веб-элемент управления для раскрывающегося списка состояний. Элемент управления всегда будет содержать одни и те же данные. Когда он рендерится, вы заполняете источник данных. Когда он будет добавлен в сетку, данные будут в выпадающем списке. Надеюсь, это поможет!

0 голосов
/ 04 декабря 2009

В мире winforms я вытаскиваю свои объекты из БД в список (из чего угодно) и использую список в качестве источника данных.

Это также позволяет мне добавлять дополнительные «удобные» поля в объект, чтобы я мог заполнять его данными из других таблиц.

Я совсем не знаю asp.net, так что если вы можете сделать что-то подобное, это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...