我有一个网格,我通过aspx页面在模板字段中添加了几列。
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="lnkBtnDown" runat="server" CommandName="Download" Text="Download"></asp:LinkButton>
<asp:LinkButton ID="LnkBtnMan" runat="server" CommandName="Manual" Text="Manual"
Style="margin-left: 10px"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
网格显示一个表中的搜索结果,并且我必须隐藏一些列,例如文件名列等,但我确实需要数据...所以我使用css样式隐藏它们。
private void generateSearchGrid(DataTable dt)
{
if (dt == null || dt.Rows.Count == 0)
return;
dgvSearchResults.DataSource = dt;
dgvSearchResults.AutoGenerateColumns = false;
BoundField bfName = new BoundField();
bfName.DataField = dt.Columns["OsmProjectName"].ToString();
bfName.HeaderText = "Project Name";
BoundField bfProjID = new BoundField();
bfProjID.DataField = dt.Columns["OsmProjectID"].ToString();
bfProjID.HeaderText = "ID";
BoundField bfProjFile = new BoundField();
bfProjFile.DataField = dt.Columns["OsmProjectFile"].ToString();
bfProjFile.HeaderText = "Project File";
BoundField bfProjManual = new BoundField();
bfProjManual.DataField = dt.Columns["OsmProjectManual"].ToString();
bfProjManual.HeaderText = "Project Manual";
BoundField bfProjType = new BoundField();
bfProjType.DataField = dt.Columns["OsmProjectType"].ToString();
bfProjType.HeaderText = "Project Type";
dgvSearchResults.Columns.Add(bfProjID);
dgvSearchResults.Columns.Add(bfName);
dgvSearchResults.Columns.Add(bfProjType);
// WARNING : Keep these two at the end all the time in the same order.
dgvSearchResults.Columns.Add(bfProjFile);
dgvSearchResults.Columns.Add(bfProjManual);
dgvSearchResults.DataBind();
// Assigning a css where display has been set to none.
bfProjManual.HeaderStyle.CssClass = "hiddenCols";
bfProjID.HeaderStyle.CssClass = "hiddenCols";
bfProjFile.HeaderStyle.CssClass = "hiddenCols";
bfProjManual.ItemStyle.CssClass = "hiddenCols";
bfProjID.ItemStyle.CssClass = "hiddenCols";
bfProjFile.ItemStyle.CssClass = "hiddenCols";
}
在每个搜索按钮点击事件开始时,我刷新网格,
dgvSearchResults.DataSource = null;
dgvSearchResults.DataBind();
dgvSearchResults.Columns.Clear();
但是这会清除所有列,包括我在aspx页面中绑定的列......如预期的那样。如果我不清除它们,搜索结果中的列只会堆积起来。
有没有办法可以只清除动态绑定的列?
答案 0 :(得分:1)
如果你知道你在aspx页面中添加了多少以及你动态添加了多少,你可以这样做。
//if total added in aspx page is 2, first one is in index 0, second in index 1
dgvSearchResults.Columns.RemoveAt(2); // this will remove the 3rd column
dgvSearchResults.Columns.RemoveAt(3); // this will remove the 4th columns
// you can continue till column x
答案 1 :(得分:1)
一个选项是 dgvSearchResults GridView的disable viewstate。在这种情况下,每次回发,您都需要将 dgvSearchResults 与数据绑定。如果您不绑定,动态添加的列将自动删除(不保留)。
这将发生,因为在您的情况下,动态添加的数据(以及列)将保留回发到隐藏元素(viewstate)中的回发。
所以这将成为:
private void Page_Load(object sender, EventArgs e)
{
if(IsPostBack) // If postback, then bind GridView with previous search result
{
dgvSearchResults.DataSource = Session["dgvSearchResultsData"];
dgvSearchResults.DataBind();
}
}
private void generateSearchGrid(DataTable dt)
{
// ...
Session["dgvSearchResultsData"] = dt; // Save result into session
dgvSearchResults.DataSource = dt;
// ...
}
ASPX:
<asp:GridView EnableViewState="false"> ... </GridView>