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

问题描述 投票:0回答:4

抱歉之前的代码。有人可以帮忙吗? 我有一个 gridview

GridView1
,它通过从具有三列的 Excel 工作表导入来填充在
PageLoad()
上:

  1. 日期
  2. 客户
  3. PayingBookNoOrDD

工作表有五行。用户可以在页面上的文本框中编辑数据(下面的标记)。编辑后,当用户单击提交按钮时,我需要从所有文本框中获取这些新值,并从填充

GridView
的位置更新相同的 Excel 工作表。

我创建了三个字符串数组:

dateArray
custArray
payingInBookArray
来存储这些新值。但是当我运行应用程序时,所有三个数组都是空的。

标记:

<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()); 

}

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

谢谢。

c# asp.net gridview textbox templatefield
4个回答
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();
    }
}

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()
。命名约定和其他小的源代码更改现在不会花费您很多时间来修复,但是当您在其他项目上工作数周或数月后必须重新访问此代码时,将为您节省大量时间。


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

End Sub

0
投票

尝试使用以下方法收集值

foreach(GridView1.Rows 中的 GridViewRow gr)

{

string date= ((TextBox)gr.FindControl("txtDate")).text;

}

© www.soinside.com 2019 - 2024. All rights reserved.