我有一个应用程序页面,允许用户从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上是空的?
答案 0 :(得分:0)
我认为您可以覆盖oninit然后设置下拉列表的值。当生命周期到达数据源的数据绑定时,假设您有一个与下拉列表关联的控制参数。数据源应该使用您设置的值按预期工作。
希望这会有所帮助
用于将下拉列表设置为具有空的默认项目,这是我通常所做的
<asp:dropdown .... AppendDataBoundItems=true>
<asp:item value="">-- select one--</asp:item>
</asp:dropdown>
自然需要一些清理,但你应该得到它的要点