问题描述
|
我有一个主详细信息网格。当我关注主网格时,它将显示信息详细网格。它一次显示一个焦点一个网格,但希望将先前的数据保留在详细网格中,而将第二个聚焦行数据也保留在网格中像这样以前的数据
解决方法
您可以处理主网格的SelectedIndexChanged事件,并将所选项目的数据键放在单独的列表中。之后,使用所有主网格数据重新绑定详细信息网格,这些ID将存储在该列表中。
<asp:GridView ID=\"MasterGridView\" runat=\"server\" AutoGenerateColumns=\"false\" Caption=\"Master\"
DataKeyNames=\"Id\">
<Columns>
<asp:CommandField ShowSelectButton=\"true\" SelectText=\"Select\" />
<asp:BoundField HeaderText=\"Id\" DataField=\"Id\" />
<asp:BoundField HeaderText=\"Name\" DataField=\"Name\" />
</Columns>
</asp:GridView>
<hr />
<asp:GridView ID=\"DetailsGridView\" runat=\"server\" AutoGenerateColumns=\"false\"
DataKeyNames=\"Id\" Caption=\"Details\">
<Columns>
<asp:CommandField ShowSelectButton=\"true\" SelectText=\"Select\" />
<asp:BoundField HeaderText=\"Id\" DataField=\"Id\" />
<asp:BoundField HeaderText=\"Name\" DataField=\"Name\" />
<asp:BoundField HeaderText=\"Age\" DataField=\"Age\" />
</Columns>
</asp:GridView>
后台代码:
private List<MyClass> MasterGridViewDataSource
{
get { return Session[\"MasterGridViewDataSource\"] as List<MyClass>; }
set { Session[\"MasterGridViewDataSource\"] = value; }
}
private List<int> SelectedIDs
{
get { return ViewState[\"SelectedIDs\"] as List<int>; }
set { ViewState[\"SelectedIDs\"] = value; }
}
protected void Page_Init(object sender,EventArgs e)
{
MasterGridView.SelectedIndexChanged += MasterGridView_OnSelectedIndexChanged;
}
protected void Page_Load(object sender,EventArgs e)
{
if (!IsPostBack)
{
var masterGridDataSource = GetMasterGridDataSource();
MasterGridViewDataSource = masterGridDataSource;
MasterGridView.DataSource = masterGridDataSource;
MasterGridView.DataBind();
SelectedIDs = new List<int>();
}
}
private List<MyClass> GetMasterGridDataSource()
{
return (from item in Enumerable.Range(1,10)
select new MyClass { Id = item,Name = string.Format(\"Item #{0}\",item),Age = item })
.ToList();
}
void MasterGridView_OnSelectedIndexChanged(object sender,EventArgs e)
{
var selectedId = (int)MasterGridView.SelectedDataKey.Value;
if (!SelectedIDs.Contains(selectedId))
SelectedIDs.Add(selectedId);
DetailsGridView.DataSource = (from item in MasterGridViewDataSource
join id in SelectedIDs on item.Id equals id
select item);
DetailsGridView.DataBind();
}
[Serializable]
public class MyClass
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}