加载带有或不带GridView参数的页面

本文关键字:参数 加载 GridView | 更新日期: 2023-09-27 18:04:22

我有一个应用程序的页面,允许用户从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();
                }
            }

        }
    }

我试图在Page_Load事件中设置GridView的DataSource属性,但随后我得到一个关于"当它使用模型绑定时,数据源和datasourceid不能在BatchReviewGrid上定义"的错误。

我想我可能只是创建一个新的DataGrid来处理传入参数的情况,如果没有传入参数,则将其隐藏,但这似乎是次优的。

我已经设置下拉列表采取参数作为其选择值,如果一个是存在于page_load -我可以不简单地强迫gridview使用这个渲染?

UPDATE:遵循@workabyte的建议,我已经改变了我的代码,使用OnInit方法来设置下拉列表的SelectedValue属性,如果设置了QueryString参数。

为了使其工作,我添加了一个ObjectDataSource并将其设置为使用我根据本教程创建的存储库中的方法http://www.asp.net/web-forms/tutorials/continuing-with-ef/using-the-entity-framework-and-the-objectdatasource-control,-part-1-getting-started

我现在有一个工作得更好的页面,因为如果页面加载ClaimRef参数集,GridView会立即响应。

我最后剩下的问题是确保如果页面被称为没有参数,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。

则在页面加载时选择列表中的第二项(索引1)。将SelectedIndex设置为-1不起作用。我还试了这个:

ClaimsListDropDown.DataBind();
ClaimsListDropDown.Items.Insert(0, new ListItem(string.Empty, string.Empty));
ClaimsListDropDown.SelectedIndex = 0;

但这也不行。有没有人有任何建议设置下拉列表,所以它没有价值,如果没有QueryString参数,因此GridView是空的页面加载?

加载带有或不带GridView参数的页面

我认为你可以覆盖oninit,然后设置下拉的值。当生命周期到达数据源的数据绑定时,假设您有一个与下拉菜单绑定的控制参数。数据源应该使用您设置的值按预期工作。

希望对您有所帮助

为下拉菜单设置一个空的默认项这是我通常做的

<asp:dropdown .... AppendDataBoundItems=true>
    <asp:item value="">-- select one--</asp:item>
</asp:dropdown>

当然需要一些清理,但你应该得到它的要点