none
[新手问题] 如何在GridView中FindControl到TemplateField中的东西? RRS feed

  • 问题

  • 如题,我有一个GridView1,里面有个TemplateField,里面有个Button1

     

    但是aspx中TemplateField并没有id,但是button1在模板列里面

     

    那我如何gridView1.FindControl。。。到模板列里面的button1呢?

    2008年3月31日 13:18

答案

  • Code Snippet


                                DataSourceID="QuestionDatasource" AutoGenerateColumns="False" CssClass="tablebgBlack width95per"
                                BorderWidth="0px" CellSpacing="1" OnDataBound="QuestionDataGridView_DataBound" OnRowDataBound="QuestionDataGridView_RowDataBound">
                               
                                   
                                       
                                            lblDeadline
    " runat="server" Text=''>
                                       
                                   

     

     

     

    Code Snippet

     protected void QuestionDataGridView_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    Label lblDeadline = (Label)e.Row.FindControl("lblDeadline");
                    if ((lblDeadline != null) && (lblDeadline.Text == DateTime.MinValue.ToString()))
                        lblDeadline.Text = "";

                }
            }

     

     

    看看,这是不是能解决你的问题呢?
    2008年4月1日 13:48

全部回复

  • 可参看这篇帖:Page.FindControl方法找不到指定控件的原因, TemplateField并不是一个实现INamingContainer的类,所以你只要定位到TemplateField上那个实现了INamingContainer的控件,就可以用FindControl方法找到你的Button1了

    2008年4月1日 0:58
    版主
  •  

    文章不错,我以前就收藏了。~问题是,并没有解决俺的问题。

     

    我想我说的不够清楚:

     

    有个GridView叫做:gridView1

    里面的TemplateField里面有个Button叫做:button1

     

    问题是:如何FindControl到这个button1,我知道用Page.FindControl()是找不到的。

     

    那么如果说TemplateField并不是"INamingContainer"的话,意思是直接用"gridView1.FindControl("button1")"就可以找到了吗???

    2008年4月1日 2:31
  • Code Snippet


                                DataSourceID="QuestionDatasource" AutoGenerateColumns="False" CssClass="tablebgBlack width95per"
                                BorderWidth="0px" CellSpacing="1" OnDataBound="QuestionDataGridView_DataBound" OnRowDataBound="QuestionDataGridView_RowDataBound">
                               
                                   
                                       
                                            lblDeadline
    " runat="server" Text=''>
                                       
                                   

     

     

     

    Code Snippet

     protected void QuestionDataGridView_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    Label lblDeadline = (Label)e.Row.FindControl("lblDeadline");
                    if ((lblDeadline != null) && (lblDeadline.Text == DateTime.MinValue.ToString()))
                        lblDeadline.Text = "";

                }
            }

     

     

    看看,这是不是能解决你的问题呢?
    2008年4月1日 13:48
  •  

    可以用 董文超的代码解决问题
    2008年4月2日 1:00
    版主
  •  

    asp.net 2.0里面GridView这样写也找不到。晕死~
    2008年7月22日 6:20
  •  

    先定义<asp:Button id="button1" commandName="xxx" CommandArgument="参数"(可不写) .../>

     

     

    protected void gridView1_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                if (e.CommandName == "xxx")
                {
                    string str = e.CommandArgument;

    ...

    ...

                }
            }

     

    2008年7月22日 8:45
  • 导致这种情况的原因是在page_load中有gridView1.Columns.Remat(3),这样的代码(根据不同的条件显示不同的列),gridView1_RowDataBound事件中下面的类似代码,

     Label lblDeadline = (Label)e.Row.FindControl("lblDeadline");

    就会不行,尽管gridView1.Columns.Remat(3)移除的不是对应的列。不知道为什么?
    不断挑战自我
    2009年3月16日 5:45
  • 这个在正常情况下可以,如果page_load中做了gridView1.Columns.Remat(3),这样的代码(根据不同的条件显示不同的列),就不行了。所以还是没有解决问题。
    不断挑战自我
    2009年3月16日 5:48