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

时间:2014-05-21 15:23:04

标签: c# asp.net gridview dropdownbox

我有一个应用程序页面,允许用户从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属性,但后来我得到一个关于&#34;数据源和datasourceid的错误,当它使用模型绑定&#34;时,无法在BatchReviewGrid上定义。

我在想我可能只是创建一个新的DataGrid来处理传入param的情况,并且如果没有传递param则保持隐藏,但这似乎是次优的。

我已经设置了下拉列表,如果page_load上存在一个param作为其选择的值 - 我不能简单地强制使用grid来渲染gridview吗?

UPDATE :关注@ workabyte的建议我已经更改了我的代码,如果设置了QueryString参数,则使用OnInit方法设置DropDownList的SelectedValue属性。

为了实现这一点,我添加了一个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.SelectedIndex = 1;

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

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

但这也不起作用。有没有人有任何关于设置DropDownList的建议,所以如果没有QueryString参数它没有值,因此GridView在pageload上是空的?

1 个答案:

答案 0 :(得分:0)

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

希望这会有所帮助

用于将下拉列表设置为具有空的默认项目,这是我通常所做的

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

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