1

こんにちは、ITemplate インターフェイスを実装して、テンプレート フィールドを gridview に動的に追加しました。テンプレート フィールドには、ラベルやテキスト ボックスなどのコントロールが含まれています。行データバインド イベントでこれらのコントロールを取得するにはどうすればよいですか。

aspx ページから templatefield を追加するときに通常行うように、 gridviewrow.findcontrol("id") を実行すると取得できません。

テンプレートフィールドを追加する方法は次のとおりです

public class CustomGridViewColumn : ITemplate { ListItemType _liType; string _columnName;

        public CustomGridViewColumn(ListItemType type, string column)
        {
            _liType = type;
            _columnName = column;

        }
        void ITemplate.InstantiateIn(System.Web.UI.Control container)
        {
            switch (_liType)
            {
                case ListItemType.Header:
                    Label lblHeader = new Label();
                    lblHeader.Text = _columnName;
                    container.Controls.Add(lblHeader);
                    break;
                case ListItemType.Item:
                    Label lblItem = new Label();
                    lblItem.DataBinding += new EventHandler(lbl_DataBinding);
                    lblItem.ID = "lbl" + _columnName;
                    lblItem.ClientIDMode = ClientIDMode.Predictable;
                    container.Controls.Add(lblItem);

                    DropDownList ddl = new DropDownList();

                    ddl.DataBinding += new EventHandler(ddl_DataBinding);
                    ddl.ID = "ddl" + _columnName;
                    ddl.Visible = false;
                    container.Controls.Add(ddl);
                    break;


            }
        }

}

今、このコードを使用して追加したラベルとドロップダウンにアクセスしたいと思います。gridviewrow.findcontrol("id") を実行すると、取得できません。誰でも私を助けてください。

すべての行を調べて見つけようとすると、私はうんざりしていますが、それを選択すると行にチェックボックスがあり、すべてのラベルが消え、ddls が表示されます。これには、次のコードを使用しています。

protected void chkEdit_CheckedChanged(object sender, EventArgs e) { CheckBox chkEditTest = (CheckBox)sender; GridViewRow grow = (GridViewRow)chkEditTest.NamingContainer; DropDownList ddl = (DropDownList)grow.FindControl("ddl"); Label lbl= (Label)grow.FindControl("lbl"); }

これを行うと、コントロールを取得できません。ポストバックでコントロールが消えているようです..

4

2 に答える 2

0

This is what I came up with and I can able to get the control reference in the code behind.

    public class CustomGridViewColumn : ITemplate
    {
    ListItemType _liType; string _columnName;

    public CustomGridViewColumn(ListItemType type, string column)
    {
        _liType = type;
        _columnName = column;

    }

    void ITemplate.InstantiateIn(Control container)
    {
        switch (_liType)
        {
            case ListItemType.Header:
                Label lblHeader = new Label();
                lblHeader.Text = _columnName;
                container.Controls.Add(lblHeader);
                break;
            case ListItemType.Item:
                Label lblItem = new Label();
                lblItem.DataBinding += new EventHandler(lblItem_DataBinding);
                lblItem.ID = "lbl" + _columnName;
                lblItem.ClientIDMode = ClientIDMode.Predictable;
                container.Controls.Add(lblItem);

                DropDownList ddl = new DropDownList();

                ddl.DataBinding += new EventHandler(ddl_DataBinding);
                ddl.ID = "ddl" + _columnName;
                ddl.Visible = false;
                ddl.DataSource = new string[] { "Hello", "World" };
                container.Controls.Add(ddl);
                break;


        }
    }

    void ddl_DataBinding(object sender, EventArgs e)
    {

    }

    void lblItem_DataBinding(object sender, EventArgs e)
    {

    }

}

 protected void Page_Load(object sender, EventArgs e)
 {

    DataTable dt = new DataTable();
    dt.Columns.Add("Name");
    DataRow oItem = dt.NewRow();
    oItem[0] = "Deepu";
    dt.Rows.Add(oItem);
    oItem = dt.NewRow();
    oItem[0] = "MI";
    dt.Rows.Add(oItem);
    GridView gv = new GridView();
    gv.ID = "myGridView";
    gv.AutoGenerateColumns = false;
    BoundField nameColumn = new BoundField();
    nameColumn.DataField = "Name";
    nameColumn.HeaderText = "Name";
    gv.Columns.Add(nameColumn);

    TemplateField TmpCol = new TemplateField();
    TmpCol.HeaderText = "Template Column";
    gv.Columns.Add(TmpCol);
    TmpCol.ItemTemplate = new CustomGridViewColumn(ListItemType.Item, "TEST");
    gv.DataSource = dt;
    gv.DataBind();
    Form.Controls.Add(gv);


}
protected void Button1_Click(object sender, EventArgs e)
{
    GridView gv = Form.FindControl("myGridView") as GridView;
    foreach (GridViewRow item in gv.Rows)
    {
        var ddl = item.FindControl("ddlTest") as DropDownList;
        if (ddl != null)
        {
            ddl.Visible = true;
        }

        var lbl = item.FindControl("lbl") as Label;
        if (lbl != null)
        {
            lbl.Text = "hello";
        }
    }
}

<form id="form1" runat="server">


<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />


</form>

Thanks

Deepu

于 2012-04-09T08:03:04.440 に答える
-2

GRIDVIEW コントロールの行インデックスを使用してみてください。

var rowIndex = int.Parse(e.CommandArgument)
GridView1.Rows[rowIndex].FindControl("id")

こちらも参照

http://forums.asp.net/t/998368.aspx/1

http://www.codeproject.com/Articles/12021/Accessing-the-different-controls-inside-a-GridView

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridviewrow.aspx

ありがとう

ディープ

于 2012-04-09T06:55:04.813 に答える