模板EditItemTemplate的文本框可以在编辑行是显示文本框,但是运行时发现只要是文本格式的单元格,文本框显示都会显示很多空格,无论是否有数据。
这个就很麻烦,每次修改时都必须先将空格删除,否则录入就有可能错误。我想使用trim()方法,将这些空格清除。但是却不知道怎么将这些模板列的文本框取出来。
我使用过一下方法foreach (GridViewRow grow in GridView1.Rows)
        {
            
                TextBox textbox = (TextBox)grow.Cells[4].FindControl("TextBox2");
                textbox.Text = textbox.Text.Trim();
           
        } 
foreach (Control control in GridView1.TemplateControl.Controls)
            {
                if (control is TextBox)
                {
                    TextBox textBox =(TextBox)control;
                    textBox.Text = textBox.Text.Trim();
                }
            }结果都不行,实在是想不出其他的办法啦。另外,原来我写过一个遍历页面控件,将文本框空格清除的方法
foreach (Control control in Controls)
            {
                foreach (Control c in pControls)
                {
                    foreach (Control childc in c.Controls)
                    {
                        if (childc is TextBox)
                        {
                            TextBox textBox = (TextBox)childc;
                            textBox.Text = textBox.Text.Trim();
                        }
                    }
                }
            }
但为什么,照理说gridview.controls集合应该也可以遍历取出文本框控件,但为什么不行呢?

解决方案 »

  1.   

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.EmptyDataRow)
            {
                
                 TextBox textbox = e.Row.FindControl("TextBox2") as TextBox;
                 if(textbox!=null)
                    textbox.Text = textbox.Text.Trim();        }
        }
      

  2.   

    我试啦一下这个代码
    原来是这样:
    <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("year") %>'></asp:TextBox>
    我该为:
    <asp:TextBox ID="TextBox4" runat="server" Text='<%# bakstr(Eval("year")) %>'></asp:TextBox>
    bakstr方法是一个去除字符串前后空格的方法,year是字段。
    代码如下:
    public string bakstr(string str)
        {
            return str.Trim();
        }但是系统提示
    编译器错误消息: CS1502: 与“kpi_test.bakstr(string)”最匹配的重载方法具有一些无效参数。。
      

  3.   

    1 楼 什么谢谢你的答案。
    不过我测试过后,并不起作用。
    我跟踪执行后发现,根本进不了判断语句
    if (e.Row.RowType == DataControlRowType.EmptyDataRow)
      

  4.   

    <%# bakstr(Eval("year")) %>'提示错误因为Eval("year")是Object类型,需要ToString();或者你的方法那里改一下,改成
    public string bakstr(object obj)
    {}
      

  5.   

    TextBox6.Text = e.Item.Cells[7].Text.Trim().Replace("&nbsp;", "");
    比如说读取时可以加在后面加.Replace("&nbsp;", "") 这样显示在页面就没空格了。
      

  6.   

    这个应该是你数据库的问题吧,你应该把字段设为varchar可变长型,而不是char定长型
      

  7.   


    不是这个问题,因为在模板列的文本框默认就有空格,用户在输入的时候不不注意就会将空格一起保存到数据库。虽然可以用验证控件提示用户有空格,不过这样用户用起来很麻烦。另外,由于业务需要,我必须在模板列文本框中计算。例如模板列文本框txetbox1填入一个数字后,要计算后填入textbox2
    textbox2.txt=convnter.toint16(textbox1.text)*3+1;这样无论是否要清除文本框空格,都必须吧当前激活的模板列文本框取出来计算,现在就是不知道怎么将这些模板列文本框取出来。
      

  8.   


    你的这个方法可行,谢谢。不过又有一个新问题:<%# bakstr(Eval("year")) %>这样以后就是不是双向绑定啦
    修改就不能写回数据库。
    <%#Bind(bakstr(Eval("year"))) %>这样写也不对。那么有没有办法先text=<%#Bind("year")%> ,然后在把对text赋值呢?要是能在后台代码中直接调用到模板列的文本框就好啦。
    直接在后后台一个textBox1.text=textBox1.text.Trim();多好啊。但是后台怎么也取不了模板列中的文本框。
      

  9.   

    这个文本框还是得使用遍历gridview的方法取得,感谢楼上各位回答。
    散分。