加载带有或不带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是空的页面加载?
我认为你可以覆盖oninit,然后设置下拉的值。当生命周期到达数据源的数据绑定时,假设您有一个与下拉菜单绑定的控制参数。数据源应该使用您设置的值按预期工作。
希望对您有所帮助
为下拉菜单设置一个空的默认项这是我通常做的
<asp:dropdown .... AppendDataBoundItems=true>
<asp:item value="">-- select one--</asp:item>
</asp:dropdown>
当然需要一些清理,但你应该得到它的要点