2

基本的に、コントロール (TextBox、DropDownList) を含む新しい列を GridView に追加するボタンが必要です。

これですでに十分に単純に思えます:

protected void btn_AddColumn_Click(object sender, EventArgs e)
{
    TemplateField MyTemplateField = new TemplateField();
    gv_SupplierPrices.Columns.Add(MyTemplateField);
}

このマークアップを追加したいとします。

<asp:TemplateField>
    <ItemTemplate>
       <table style="width:100%;">
          <tr>
             <td><asp:TextBox ID="tbox_ItemPrice" runat="server"></asp:TextBox></td>
          </tr>
       </table>
     </ItemTemplate>
</asp:TemplateField>

これが問題です。.aspx ページのマークアップで作成した TemplateField を使用して、コード ビハインドの新しい列に追加するにはどうすればよいですか? 精巧なまたは派手なマークアップを作成できないため、コード ビハインドで TemplateField を作成したくありません。それらは、互いに隣り合っているコントロールのように見えます。とても醜いです。

PS 誰かが私が実際に何を作っているのか知りたい場合は、基本的に GridView を Excel のようなグリッドシートに変えています。新しい列はサプライヤーを表し、各行はサプライヤーが販売しているアイテムを表します。彼らはそれを望んでいます。なぜなら、彼らはそれを埋めている間、価格を並べて比較する方が簡単だからです.


更新:私はすでにそれを理解しました。マークアップで作成した TemplateField を表す分離コードから GridView の列を呼び出すだけで、それを追加できます。

<asp:GridView ID="gv_SupplierTable" runat="server" AutoGenerateColumns="False" 
                        DataKeyNames="Id" DataSourceID="TestTable_DS">
                        <Columns>
                            <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" 
                                ReadOnly="True" SortExpression="Id" />
                            <asp:BoundField DataField="AccountType" HeaderText="AccountType" 
                                SortExpression="AccountType" />
                            <asp:TemplateField AccessibleHeaderText="MyTemplateFieldCreated in Markup">
                                <ItemTemplate>
                                    <table style="width:100%;">
                                        <tr>
                                            <td><asp:TextBox ID="tbox_ItemPrice" runat="server"></asp:TextBox></td>
                                        </tr>
                                    </table>
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>

コード ビハインドでは、マークアップで作成された TemplateField を表す列にアクセスし、新しいコピーのようにボタン クリックで再度追加できます。

    protected void btn_AddColumn_Click(object sender, EventArgs e)
    {
    DataControlField newColumn = this.gv_SupplierTable.Columns[2]; 
                                 //this column at index #2 from my GridView represents                  
                                 the TemplateField created in markup since the columns  
                                 at index #0 and index #1 are DataBound.
    gv_SupplierTable.Columns.Add(newColumn);
    }
4

3 に答える 3

1

各列の表示を切り替えることができます。

gv_SupplierPrices.Columns[10].Visible = true;
于 2012-10-01T15:46:56.977 に答える
1

あなたの立場では、私は弾丸を噛んで、テンプレート化されたフィールドをプログラムで作成することを検討することを検討します. 面倒だけど、終わったら終わり。もちろん、それらをヘルパー クラスまたは個別のコントロールに抽象化する必要があります。

于 2012-10-01T22:01:19.823 に答える
0

に列を動的に追加する例をいくつか示しますGridView

protected void Page_Init(object sender, EventArgs e)
{
    btnAddColumn.Click += new EventHandler(btnAddColumn_Click);

    BoundField temp = new BoundField();
    temp.DataField = "Source";
    temp.HeaderText = "Source";
    temp.SortExpression = "Source";

    gv.Columns.Add(temp);
}

void btnAddColumn_Click(object sender, EventArgs e)
{
    TemplateField temp = new TemplateField();
    temp.HeaderText = txtNewColumn.Text;

    txtNewColumn.Text = string.Empty;

    gv.Columns.Add(temp);
}

ASPX:

<div>
    <asp:TextBox ID="txtNewColumn" runat="server" />
    <asp:Button ID="btnAddColumn" runat="server" Text="Add Column" />
</div>
<asp:GridView ID="gv"
    runat="server"
    AutoGenerateColumns="False"
    DataSourceID="dsExceptions">
    <Columns>
        <asp:BoundField DataField="Message" HeaderText="Message" />
    </Columns>
</asp:GridView>

<asp:ObjectDataSource ID="dsExceptions"
    runat="server" 
    SelectMethod="GetExceptions"
    TypeName="WebApplication.Data.MyDataContext" EnablePaging="True" 
    SelectCountMethod="GetExceptionCount" >
    <SelectParameters>
        <asp:Parameter Name="maximumRows" Type="Int32" />
        <asp:Parameter Name="startPageIndex" Type="Int32" />
        <asp:Parameter Name="startRowIndex" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

私の ObjectDataSource は、Exceptions私が作成したコレクションを取得しているだけなので、コードのその部分は無視できます。

そのため、ハンドラーのコードを介して列をPage_Init追加し、ヘッダー テキストが のテキストに設定された列を追加していますtxtNewColumn。ただし、これに関する 1 つのことは、ページを更新すると、ページのボタンで追加した列が失われることです。ボタン クリック イベント ハンドラーにコードを追加して新しい列を格納し、GridView再読み込み時に常に にあるようにする必要があります。列がベンダーを表しているように聞こえるので、システムにベンダーを追加するためのフォームを追加したいだけかもしれません。ベンダーはどこかのデータベース/データストアに保存されます。 では、Page_Initそのデータストアからすべてのベンダーを取得してループし、ベンダーのテンプレート フィールドを作成します。次のようになります。

// I am just creating a list here, you would pull the vendor names in from the 
// datastore here instead.
var vendors = new List<string> { "Vendor A", "Vendor B", "Vendor C" };
foreach (var vendor in vendors)
{
    TemplateField temp = new TemplateField();
    temp.HeaderText = vendor;
    gv.Columns.Add(temp);
}
于 2012-10-01T22:13:14.263 に答える