DetailsView / FormView - множественный выбор (ListBox или Select) в EditItemTemplate теряет выбор после редактирования ItemCreated - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть ASP.NET 3.5 GridView, содержащий список документов. Когда у меня были все поля в Gridview, включая выпадающий список Select, чтобы выбрать, для каких состояний охватывается каждый документ - это работало.

Пытаясь упростить использование, я переместил детали строки в DetailsView - а затем в FormsView - ни один из типов не покажет выбранные ранее назначенные состояния для записи.

Я пробовал события ItemCreated и DataBound - элемент управления EditItemTemplate States можно найти только в событии ItemCreated. Первоначально у меня была привязка ObjectDataSource DataSourceId, но я также пробовал ручную привязку в событии ItemCreated (чтобы убедиться, что он там был, он добавил состояния - затем перебирал состояния и выбирал их.

Они отображаются как выбранные в элементе управления при выходе из события ItemCreated, но при отображении на странице ничего не выбирается. (Если я выберу новые состояния и обновлю - они сохранят новые и покажут им метку ItemTemplate dStateList.)

Как я могу получить ListBox StateList, чтобы сохранить выбранные состояния и показать их в Edit?

protected void DocumentDetail_DataBound(Object sender, EventArgs e)
{
    if (gvDocumentList.SelectedValue == null)
        return;
    int id = (int)gvDocumentList.SelectedValue;
    if (DocumentDetail.CurrentMode == FormViewMode.Edit)
    {
        //HtmlSelect selListStateList = (HtmlSelect)DocumentDetail.FindControl("seselStateList");
        ListBox selListStateList = (ListBox)DocumentDetail.FindControl("lbselStateList");
        if (selListStateList != null)
        {
            // NEVER Hits - selListStateList is always null
            DataSet states = States(); // Get full list of all states
            selListStateList.DataSource = states;
            selListStateList.DataBind();
            // Set selected states from list
            List<string> listOfStates = AdministrationService.GetDMStatesForDoc(id);
            foreach (string state in listOfStates)
            {
                selListStateList.Items.FindByValue(state).Selected = true;
            }
        }
    }
}


protected void DocumentDetail_ItemCreated(Object sender, EventArgs e)
{
    if (gvDocumentList.SelectedValue == null)
        return;
    int id = (int)gvDocumentList.SelectedValue;
    // Get List of states for this document
    List<string> listOfStates = GetStatesForDoc(id);
    if (DocumentDetail.CurrentMode == FormViewMode.ReadOnly)
    {
        Label stateList = DocumentDetail.FindControl("dStateList") as Label;
        if (stateList != null)
        {
            if (listOfStates.Count > 0)
            {
                stateList.CssClass = "";
                stateList.Text = string.Join(", ", listOfStates.ToArray());
            }
            else
            {
                stateList.CssClass = "bg-danger text-white";
                stateList.Text = "None Selected";
            }
        }
    }
    else
    {
        //HtmlSelect selListStateList = (HtmlSelect)DocumentDetail.FindControl("seselStateList");
        ListBox selListStateList = (ListBox)DocumentDetail.FindControl("lbselStateList");
        if (selListStateList != null)
        {
            // THIS DOES Hit
            DataSet states = States();
            selListStateList.DataSource = states;
            selListStateList.DataBind();
            // Set selected states from list
            foreach (string state in listOfStates)
            {
                // THIS Does find and set selected on correct items
                selListStateList.Items.FindByValue(state).Selected = true;
            }
        }
    }
}

<asp:FormView ID="DocumentDetail" AutoGenerateRows="False" EmptyDataText="Select Document to view Details" 
    DataKeyNames="Id" DataSourceID="odsDocument" CssClass="table-sm table-borderless table-striped rounded-top w-100"
    OnItemCreated="DocumentDetail_ItemCreated" BorderStyle="None" BorderWidth="0px" 
    OnItemUpdated="DocumentDetail_ItemUpdated"
    OnItemUpdating="DocumentDetail_ItemUpdating"
    OnItemDeleted="DocumentDetail_ItemDeleted" 
    OnModeChanged="DocumentDetail_ModeChanged"                               
    OnDataBinding="DocumentDetail_DataBound"
    runat="server">
        <ItemTemplate>
            <table>
                <tr>
                    <td>
                        <asp:LinkButton ID="EditButton" Text="Edit" CommandName="Edit" RunAt="server"/>
                        &nbsp;
                        <asp:LinkButton ID="DeleteButton" Text="Delete" CommandName="Delete" RunAt="server"/>
                    </td>
                </tr>
                <tr>
                    <th style="width:50%">Document Name</th>

                </tr>
                <tr>
                    <td><asp:Label ID="lblDocumentName" Width="100%" runat="server" Text='<%# Eval("DocumentName") %>'></asp:Label></td>
                </tr>
                <tr>
                    <th>State List</th>
                </tr>
                <tr>
                    <td>
                        <asp:Label ID="dStateList" Style="width: 90%;" runat="server"></asp:Label>
                    </td>
                </tr>
            </table>
        </ItemTemplate>
        <EditItemTemplate>
            <table>
                <tr>
                    <td>
                        <asp:LinkButton ID="UpdateButton" Text="Update" CommandName="Update" RunAt="server"/>
                        &nbsp;
                        <asp:LinkButton ID="CancelButton" Text="Cancel" CommandName="Cancel" RunAt="server"/>
                    </td>
                </tr>
                <tr>
                    <th>Document Name</th>
                </tr>
                <tr>
                    <td><asp:TextBox ID="etbDocumentName" CssClass="form-control" runat="server" Text='<%# Bind("DocumentName") %>'></asp:TextBox></td>
                    </td>
                </tr>
                <tr>
                    <th>State List</th>
                </tr>
                <tr>
                    <td>                                                    
                        <asp:ListBox ID="lbselStateList" CssClass="form-control multiselect" SelectionMode="Multiple"
                            DataTextField="Long_State" DataValueField="State"
                            runat="server"></asp:ListBox>
                    </td>
                </tr>
            </table>
        </EditItemTemplate>
</asp:FormView>

<script type="text/javascript">
    $(document).ready(function() {                    
        $('.multiselect').multiselect({
            includeSelectAllOption: true,
            maxHeight: 400,
            buttonWidth: '250px',
            nonSelectedText: 'Select state(s)',
            allSelectedText: 'All selected'
        });
    });
</script>

1 Ответ

0 голосов
/ 26 ноября 2018

Я отказался от использования элементов управления MS для деталей документа - действительно хотел иметь возможность использовать их для обработки функций сохранения, обновления, удаления - более безопасных и простых в теории ... Я не мог получить встроенный список для заполнения и выберите назначенный «множественный» выбор штатов США для установки в событии ItemCreated. Рассматривая несколько сообщений об использовании DetaisView и FormsView - удивило, что никто не столкнулся с проблемой заполнения встроенного списка с множественным выбором. Например, почему событие ItemCreated устанавливает значения для других элементов данных правильно, но не может сохранять правильные выпадающие списки - остальные элементы отображаются правильно, только не выпадающие элементы после загрузки страницы = где они очищаются?

Решение состояло в том, чтобы переместить их в div, который позволял разделить содержимое div между «добавить новый» и «редактировать / удалить», а затем просто показать / скрыть правильные кнопки в зависимости от того, какое состояние было активным. Множество дискретной логики, так как некоторые значения были доступны только для чтения, присутствовали / не присутствовали в зависимости от режима, а другие редактировались ... но в итоге работали хорошо.

...