0

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ページでバインドした列を含むすべての列がクリアされます..期待どおりです。それらをクリアしないと、検索結果の列が積み重なっていきます。

動的にバインドされた列のみをクリアする方法はありますか?

4

2 に答える 2

1

1つのオプションは、dgvSearchResultsGridViewのビューステートを無効することです。この場合、すべてのポストバックで、dgvSearchResultsをデータにバインドする必要があります。バインドしない場合、動的に追加された列は自動的に削除されます(永続化されません)。

これは、動的に追加されたデータ(および列)が非表示の要素(ビューステート)でポストバックからポストバックに保持されるために発生します。

したがって、これは次のようになります。

   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>
于 2013-01-10T18:35:32.513 に答える
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
于 2013-01-10T18:18:40.673 に答える