У меня есть 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"/>
<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"/>
<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>