Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 从GridView中动态添加的模板字段中按id查找控件_Asp.net_Gridview - Fatal编程技术网

Asp.net 从GridView中动态添加的模板字段中按id查找控件

Asp.net 从GridView中动态添加的模板字段中按id查找控件,asp.net,gridview,Asp.net,Gridview,嗨,我通过实现ITemplate接口将模板字段动态添加到gridview。 模板字段包含一些控件,如标签和文本框。如何在行数据绑定事件中获取这些控件 当我执行gridviewrow.findcontrol(“id”)时,我无法像通常从aspx页面添加templatefield时那样获取 我添加模板字段的方式如下 公共类CustomGridViewColumn:ITemplate { ListItemType _liType; 字符串\u columnName; public Cu

嗨,我通过实现ITemplate接口将模板字段动态添加到gridview。 模板字段包含一些控件,如标签和文本框。如何在行数据绑定事件中获取这些控件

当我执行gridviewrow.findcontrol(“id”)时,我无法像通常从aspx页面添加templatefield时那样获取

我添加模板字段的方式如下

公共类CustomGridViewColumn:ITemplate
{
ListItemType _liType;
字符串\u 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应该显示 为此,我使用以下代码

protectedvoid chkEdit\u CheckedChanged(对象发送方,事件参数e)
{
复选框chkEditTest=(复选框)发送方;
GridViewRow grow=(GridViewRow)chkEditTest.NamingContainer;
DropDownList ddl=(DropDownList)grow.FindControl(“ddl”);
Label lbl=(Label)grow.FindControl(“lbl”);
}

当我这样做时,我无法获得控制。
回发时控件似乎消失了。

您可以尝试使用GRIDVIEW控件的行索引吗

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

谢谢


Deepu

这是我想到的,我可以在代码中获得控件引用

    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>
公共类CustomGridViewColumn:ITemplate
{
ListItemType\u liType;string\u columnName;
公共CustomGridViewColumn(ListItemType类型,字符串列)
{
_li类型=类型;
_columnName=列;
}
void ITemplate.ein(控制容器)
{
开关(_li类型)
{
案例ListItemType.Header:
Label lblHeader=新标签();
lblHeader.Text=\u columnName;
container.Controls.Add(lblHeader);
打破
案例列表项目类型。项目:
Label lblItem=新标签();
lblItem.DataBinding+=新事件处理程序(lblItem\u DataBinding);
lblItem.ID=“lbl”+\u columnName;
lblItem.clientdmode=clientdmode.Predictable;
container.Controls.Add(lblItem);
DropDownList ddl=新的DropDownList();
ddl.DataBinding+=新事件处理程序(ddl_数据绑定);
ddl.ID=“ddl”+\u columnName;
ddl.Visible=false;
ddl.DataSource=新字符串[]{“Hello”,“World”};
container.Controls.Add(ddl);
打破
}
}
无效ddl_数据绑定(对象发送方、事件参数)
{
}
void lblItem_数据绑定(对象发送方,事件参数e)
{
}
}
受保护的无效页面加载(对象发送方、事件参数e)
{
DataTable dt=新的DataTable();
dt.列。添加(“名称”);
DataRow oItem=dt.NewRow();
oItem[0]=“Deepu”;
dt.行。添加(oItem);
oItem=dt.NewRow();
oItem[0]=“MI”;
dt.行。添加(oItem);
GridView gv=新的GridView();
gv.ID=“myGridView”;
gv.AutoGenerateColumns=false;
BoundField nameColumn=新的BoundField();
nameColumn.DataField=“Name”;
nameColumn.HeaderText=“Name”;
gv.Columns.Add(名称列);
TemplateField TmpCol=新TemplateField();
TmpCol.HeaderText=“模板列”;
gv.Columns.Add(TmpCol);
TmpCol.ItemTemplate=新的CustomGridViewColumn(ListItemType.Item,“测试”);
gv.DataSource=dt;
gv.DataBind();
表格.控件.添加(gv);
}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
GridView gv=Form.FindControl(“myGridView”)作为GridView;
foreach(gv.Rows中的GridViewRow项)
{
var ddl=item.FindControl(“ddlTest”)作为DropDownList;
如果(ddl!=null)
{
ddl.Visible=true;
}
var lbl=作为标签的item.FindControl(“lbl”);
如果(lbl!=null)
{
lbl.Text=“你好”;
}
}
}
谢谢


Deepu

这对于从aspx添加的控件非常有效。我想当模板字段是动态添加..这是工作正常。。但我通过调试观察到,当发生回发时,模板字段控件丢失。你能看一下我对这篇文章的修改吗。。