Невозможно получить значения из текстовых полей в templateField внутри gridview - PullRequest
5 голосов
/ 06 октября 2011

Извините за код ранее. Может ли кто-нибудь помочь, пожалуйста? У меня есть gridview GridView1, который заполняется на PageLoad() путем импорта из листа Excel, который имеет три столбца:

  1. Дата
  2. Пользователи
  3. PayingBookNoOrDD

Лист состоит из пяти рядов. Пользователи могут редактировать данные в текстовых полях на странице (разметка ниже). После редактирования, когда пользователь нажимает кнопку отправки, мне нужно получить эти новые значения из всех текстовых полей и обновить тот же лист Excel, из которого был заполнен GridView.

Я создал три строковых массива: dateArray, custArray и payingInBookArray для хранения этих новых значений. Но когда я запускаю приложение, все три массива пусты.

Markup:

<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 голосов
/ 07 октября 2011

Лично я бы изменил вашу 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 голосов
/ 26 апреля 2014
Protected Sub txtNombres_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        Session("FiltroNombres") = DirectCast(sender, TextBox).Text

End Sub
0 голосов
/ 07 октября 2011

Добавьте проверку обратной передачи для вашего события 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();
    }
}
...