У меня есть Asp.net Gridview и элемент управления Listbox, использующий множественный выбор Bootstrap.
Когда пользователь выбирает элементы из списка и закрывает раскрывающийся список (именно тогда выбранные значения могут быть собраны в связку), функция загрузки Gridview будет принимать значения выбора пользователя, выполнять и выполнять привязку данных.
Я хотел бы использовать Asp Gridview для детализации функциональности.
Я также не хочу использовать событие кнопки, чтобы прочитать значение списка и выполнить привязку базы данных gridview
-На событии ondropdownhide Bootstrap Multiselect я установил значение скрытого поля для нескольких выбранных значений, таких как (1,2,3).
- Затем я установил событие onselectedindexchange в Listbox на стороне сервера, чтобы прочитать значение скрытого поля и выполнить хранимую процедуру, которая снова заполнит сетку.
<asp:ListBox ID="ListBox1" runat="server"
DataTextField="DbValueDesc"
DataValueField="DbValue"
Autopostback="True"
SelectionMode="Multiple"
Width="584px"
OnSelectedIndexChanged="ListBox1_SelectedIndexChanged">
</asp:ListBox>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:GridView ID="gvReport" runat="server"
DataKeyNames ="record_id"
AutoGenerateColumns="False"
>
<Columns>
<asp:CommandField ShowSelectButton="True"
SelectText="ShowDetails" />
<asp:BoundField DataField="item_reportname"
HeaderText="Report Name"
SortExpression="item_reportname" />
<asp:BoundField DataField="item_reportlocation"
HeaderText="Report Location"
SortExpression="item_reportlocation" />
</asp:GridView>
<script type="text/javascript">
$(document).ready(function () {
});
$(function () {
$('[id*=ListBox1]').multiselect({
includeSelectAllOption: true,
allSelectedText: 'All Selected',
buttonWidth: '400px',
buttonHeight: '200px',
maxHeight: 200,
//onChange : function(option, checked) {},
onDropdownShow: function(event) {},
onDropdownHide: function() {
document.getElementById('<%= hidTargetUserList.ClientID %>').value =
$('[id*=ListBox1]').val();
},
selectAllValue: 0,
selectAllName: 'TargetUserAll',
});
});
</script>
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
FillTargetUserList();
FillReportGrid("");
}
}
private void FillTargetUserList()
{
BusinessLayer bl = new BusinessLayer();
DataSet dsTargetUser = bl.FillTargetUserList();
ListBox1.DataSource = dsTargetUser;
ListBox1.DataBind();
}
private void FillReportGrid(string targetuser )
{
BusinessLayer bl = new BusinessLayer();
DataSet dsReport = bl.FillReportGrid(targetuser);
gvReport.DataSource = dsReport;
gvReport.DataBind();
}
protected void ListBox1_SelectedIndexChanged(object sender, EventArgse)
{
string targetusers = string.Empty;
targetusers = hidTargetUserList.Value.ToString();
FillReportGrid(targetusers);
}
}
Я ожидал, что серверное событие onSelectedindexChanged будет запущено после присвоения скрытого значения поля (после закрытия раскрывающегося списка)
Но значение скрытого поля не может быть назначено из-за того, что autopostback запускает сначала серверную часть.
Моим последним средством было бы использовать вызов Ajax и вернуть данные json для ручного добавления в сетку на стороне клиента.
Можете ли вы придумать способ заполнить это, используя обработку на стороне сервера?