Загрузить страницу с или без параметра для 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>

естественно, что нуждается в некоторой очистке, но вы должны понять суть этого

Другие вопросы по тегам