无法从gridview内的templateField中的文本框中获取值

时间:2011-10-06 17:56:47

标签: c# asp.net gridview textbox templatefield

对于之前的代码感到抱歉。有人可以帮忙吗? 我有一个gridview GridView1,它通过从包含三列的Excel工作表导入PageLoad()填充:

  1. 日期
  2. 客户
  3. PayingBookNoOrDD
  4. 表格有五行。用户可以编辑页面上文本框中的数据(下面的标记)。编辑后,当用户点击提交按钮时,我需要从所有文本框中获取这些新值,并从填充GridView的位置更新相同的Excel工作表。

    我创建了三个字符串数组:dateArraycustArraypayingInBookArray来存储这些新值。但是当我运行应用程序时,所有三个数组都是空的。

    标记:

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" DataKeyNames="Date,Customers,PayingInBookNoOrDD" >
        <Columns>
        <asp:TemplateField>
            <HeaderTemplate>Date</HeaderTemplate>
            <ItemTemplate>
                <asp:TextBox runat="server" ID="txtDate" Text='<%# Bind("Date") %>'></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <HeaderTemplate>Customers</HeaderTemplate>
            <ItemTemplate>
                <asp:TextBox runat="server" ID="txtCustomers" Text='<%# Bind("Customers") %>'></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <HeaderTemplate>PayingInBookNoOrDD</HeaderTemplate>
            <ItemTemplate>
                <asp:TextBox runat="server" ID="txtPayingInBookNoOrDD" Text='<%# Bind("PayingInBookNoOrDD") %>'></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        </Columns>
    </asp:GridView>
    
    <asp:Button ID="txtSubmit" runat="server" Text="Submit" onclick="txtSubmit_Click" />
    

    代码隐藏:

    protected void Page_Load(object sender, EventArgs e)
    {
        string selectQuery = "SELECT * FROM [Month1$B2:D5]";
        OleDbConnection conn = new OleDbConnection(connString);
    
        conn.Open();
    
        OleDbDataAdapter da = new OleDbDataAdapter(selectQuery, conn);
        DataSet ds = new DataSet();
        da.Fill(ds);
    
        GridView1.DataSource = ds;
        GridView1.DataBind();
    
        conn.Close();
        da.Dispose();
        conn.Dispose();
    }
    
    protected void txtSubmit_Click(object sender, EventArgs e)
    {
        IList<string> DateArray = new List<string>();
        IList<string> custArray = new List<string>();
        IList<string> payInBookArray = new List<string>();
    
        foreach (GridViewRow gr in GridView1.Rows)
        {
            TextBox lblDate = (TextBox)gr.Cells[0].FindControl("txtDate");
            DateArray.Add(lblDate.Text);
    
            TextBox lblCustomers = (TextBox)gr.Cells[1].FindControl("txtCustomers");
            custArray.Add(lblCustomers.Text);
    
            TextBox lblPayInBookNo = (TextBox)gr.Cells[2].FindControl("txtPayingInBookNoOrDD");
            payInBookArray.Add(lblPayInBookNo.Text);
        }
    
        ExportToExcel(DateArray.ToArray(), custArray.ToArray(), payInBookArray.ToArray()); 
    
    }
    

    如果有人有解决方案,请告诉我。

    感谢。

3 个答案:

答案 0 :(得分:0)

在Page_Load事件上添加回发检查。我看不出你的btn_Submit代码有什么问题。

protected void Page_Load(object sender, EventArgs e)
{
    if(!this.IsPostBack){
         string selectQuery = "SELECT * FROM [Month1$B2:D5]";
         OleDbConnection conn = new OleDbConnection(connString);
         conn.Open();
         OleDbDataAdapter da = new OleDbDataAdapter(selectQuery, conn);
         DataSet ds = new DataSet();
         da.Fill(ds);
         GridView1.DataSource = ds;
         GridView1.DataBind();
         conn.Close();
         da.Dispose();
         conn.Dispose();
    }
}

答案 1 :(得分:0)

就个人而言,我会将您的txtSubmit_Click功能更改为:

protected void txtSubmit_Click(object sender, EventArgs e)
{
    IList<string> DateArray = new List<string>();
    IList<string> custArray = new List<string>();
    IList<string> payInBookArray = new List<string>();

    foreach (GridViewRow gr in GridView1.Rows)
    {
        TextBox lblDate = (TextBox)gr.FindControl("txtDate");
        DateArray.Add(lblDate.Text);

        TextBox lblCustomers = (TextBox)gr.FindControl("txtCustomers");
        custArray.Add(lblCustomers.Text);

        TextBox lblPayInBookNo = (TextBox)gr.FindControl("txtPayingInBookNoOrDD");
        payInBookArray.Add(lblPayInBookNo.Text);
    }

    ExportToExcel(DateArray.ToArray(), custArray.ToArray(), payInBookArray.ToArray()); 

}

我一直在尝试直接访问.Cells集合中的值时遇到问题。当你在行上调用.FindControl时会发生什么?

正如其他人所说,值得考虑HTML字段和变量的新名称。现在DateArray类型为IList似乎微不足道,但它简要地让我循环看DateArray.ToArray()。命名约定和其他小的源代码更改现在不会花费您很多时间来修复,但是在您需要在数周或数月处理其他项目之后重新访问此代码时,将为您节省大量时间。

答案 2 :(得分:0)

Protected Sub txtNombres_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        Session("FiltroNombres") = DirectCast(sender, TextBox).Text

End Sub