Загрузить страницу с или без параметра для GridView
У меня есть страница приложения, которая позволяет пользователю выбрать значение из элемента управления DropDownList и заполнить GridView на этой основе.
Я хочу, чтобы страница загружалась с набором параметров (возможно, через строку запроса, это внутренняя бизнес-система) для заполнения GridView с использованием этого параметра в качестве SelectedValue.
Вот ASP:
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">
<%-- Drop down lost of available claims --%>
<asp:Label ID="ClaimSelectionLabel" AssociatedControlID="ClaimsListDropDown" Text="Select a Claim to see batches" runat="server" />
<asp:DropDownList ID="ClaimsListDropDown" runat="server" AutoPostBack="true"
SelectMethod="GetClaims" ItemType="CO_GAVIN.Data.DAL.EntityFramework.Claim"
DataTextField="ClaimName" DataValueField="ClaimRef"></asp:DropDownList>
<%-- Table of Batches for a Claim determined by ClaimRef optional param passed in,
if no param then blank, selection from ClaimsListDropDown --%>
<asp:GridView ID="BatchReviewGrid" runat="server" ItemType="CO_GAVIN.Data.DAL.EntityFramework.ClaimBatch"
SelectMethod="GetBatchesInClaim" DataKeyNames="ClaimRef" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="BatchName" HeaderText="Batch Name" />
<asp:BoundField DataField="TotalDonations" HeaderText="Total Donations" />
<asp:BoundField DataField="AmountClaimed" HeaderText="Amount Claimed" />
<asp:BoundField DataField="EarliestDate" HeaderText="Begin Date" />
<asp:BoundField DataField="LatestDate" HeaderText="End Date" />
</Columns>
</asp:GridView>
</asp:Content>
И вот код позади:
public partial class ReviewBatches : System.Web.UI.Page
{
private GavinCharitiesOnlineEntities _db = new GavinCharitiesOnlineEntities();
public IQueryable<Claim> GetClaims()
{
var query =
_db.Claims
.Where(c => c.ClaimStatus == "STARTED");
return query;
}
public IQueryable<ClaimBatch> GetBatchesInClaim([Control("ClaimsListDropDown")] int? ClaimRef)
{
var query = _db.ClaimBatches
.Where(cb => cb.ClaimRef == ClaimRef);
return query;
}
protected void Page_Load(object sender, EventArgs e)
{
int ClaimRef = 0;
if (!Page.IsPostBack)
{
if (!string.IsNullOrEmpty(Request.QueryString["ClaimRef"]))
{
ClaimRef = Convert.ToInt32(Request.QueryString["ClaimRef"]);
ClaimsListDropDown.SelectedValue = ClaimRef.ToString();
}
}
}
}
Я пытался установить свойство DataSource GridView в событии Page_Load, но затем я получаю сообщение об ошибке "невозможно определить datasource и datasourceid в BatchReviewGrid, когда он использует привязку модели".
Я думал, что мог бы просто создать новую DataGrid для обработки случая, когда передается параметр, и скрывать его, если не передан параметр, но это кажется неоптимальным.
Я установил в раскрывающемся списке параметр, принимающий параметр как его выбранное значение, если он присутствует на page_load - могу ли я просто принудительно заставить представление сетки отображать это?
ОБНОВЛЕНИЕ: Следуя предложению @workabyte, я изменил свой код, чтобы использовать метод OnInit для установки свойства SelectedValue DropDownList, если задан параметр QueryString.
Чтобы заставить это работать, я добавил ObjectDataSource и установил для него использование метода из репозитория, который я создал в соответствии с этим руководством http://www.asp.net/web-forms/tutorials/continuing-with-ef/using-the-entity-framework-and-the-objectdatasource-control,-part-1-getting-started
Теперь у меня есть страница, которая работает намного лучше, поскольку GridView мгновенно реагирует, если страница загружается с набором параметров ClaimRef.
Моя последняя оставшаяся проблема состоит в том, чтобы убедиться, что если страница называется БЕЗ параметра, GridView пуст. В настоящее время по умолчанию это первый элемент в DropDownList. Я попытался очистить выбор с помощью этого:
protected override void OnInit(EventArgs e)
{
int ClaimRef = 0;
if (!Page.IsPostBack)
{
if (!string.IsNullOrEmpty(Request.QueryString["ClaimRef"]))
{
ClaimRef = Convert.ToInt32(Request.QueryString["ClaimRef"]);
ClaimsListDropDown.SelectedValue = ClaimRef.ToString();
}
else
{
ClaimsListDropDown.ClearSelection();
}
}
base.OnInit(e);
}
Но это не работает - без ошибок, просто не работает. Если я использую:
ClaimsListDropDown.SelectedIndex = 1;
Затем второй элемент в списке (индекс 1) выбирается при загрузке страницы. Установка SelectedIndex в -1 не работает. Я также попробовал это:
ClaimsListDropDown.DataBind();
ClaimsListDropDown.Items.Insert(0, new ListItem(string.Empty, string.Empty));
ClaimsListDropDown.SelectedIndex = 0;
Но это тоже не работает. У кого-нибудь есть какие-либо предложения по установке DropDownList, поэтому он не имеет значения, если нет параметра QueryString и, следовательно, GridView пуст при загрузке страницы?
1 ответ
Я думаю, что вы можете переопределить Oninit, а затем установить значение выпадающего там. к тому времени, когда жизненный цикл дойдет до привязки данных для источника данных, предполагая, что у вас есть параметр управления, связанный с раскрывающимся списком. источник данных должен работать так, как ожидается, используя заданное вами значение.
надеюсь это поможет
для установки раскрывающегося списка для пустого элемента по умолчанию это то, что я обычно делаю
<asp:dropdown .... AppendDataBoundItems=true>
<asp:item value="">-- select one--</asp:item>
</asp:dropdown>
естественно, что нуждается в некоторой очистке, но вы должны понять суть этого