2011-10-06 15 views
5

Przepraszamy za kod wcześniej. Czy ktoś mógłby ci pomóc? Mam GridView GridView1 która jest wypełniona na PageLoad() poprzez import z arkusza Excel, który ma trzy kolumny:Nie można uzyskać wartości z pól tekstowych w templateField wewnątrz widoku siatki

  1. Data
  2. Klienci
  3. PayingBookNoOrDD

Arkusz ma pięć rzędów. Użytkownicy mogą edytować dane w polach tekstowych na stronie (znaczniki poniżej). Po zakończeniu edycji, gdy użytkownik kliknie przycisk przesyłania, muszę pobrać te nowe wartości ze wszystkich pól tekstowych i zaktualizować ten sam arkusz Excel, z którego został wypełniony GridView.

Utworzono trzy ciąg tablice: dateArray, custArray i payingInBookArray do przechowywania tych nowych wartości. Ale po uruchomieniu aplikacji wszystkie trzy tablice są puste.

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" /> 

Code-tył:

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

} 

Proszę dać mi znać, jeśli ktoś ma rozwiązanie.

Dzięki.

+0

Proszę wyczyścić przykłady kodu ... zbyt wiele, aby je edytować – CAbbott

+0

Witam, jestem nowy na tej stronie. Próbowałem edytować pytanie, ale stało się jeszcze bardziej nieporządne. Proszę dać mi kilka minut, a ja to naprawię. – Amol

+0

Nie wywołuj przycisków 'txtSubmit' lub niczego poprzedzającego' txt', jeśli jest to naprawdę przycisk 'btn', może to być bardzo mylące. Powinieneś również owinąć obiekt połączenia za pomocą instrukcji 'using', dzięki czemu nie musisz jawnie wywoływać' .dispose() '. – JonH

Odpowiedz

0

Dodaj sprawdzenie odświeżenia strony zdarzenia Page_Load. Nie widzę niczego złego w twoim kodzie 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

Osobiście chciałbym zmienić swoją funkcję txtSubmit_Click do tego:

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

} 

Zawsze miałem problemy próbują uzyskać dostęp do wartości bezpośrednio w kolekcji .Cells. Co się stanie, gdy zadzwonisz pod numer .FindControl w samym wierszu?

Jak powiedzieli inni, warto pomyśleć o nowych nazwach pól HTML i zmiennych. Teraz wydaje się banalne mieć DateArray typu IList, ale krótko rzuciło mnie na pętlę, aby zobaczyć DateArray.ToArray(). Konwencje nazewnictwa i inne drobne zmiany w kodzie źródłowym nie zajmą ci dużo czasu, aby rozwiązać teraz, ale zaoszczędzą ci dużo czasu później, kiedy będziesz musiał ponownie zapoznać się z tym kodem po tygodniach lub miesiącach pracy nad innymi projektami.

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

End Sub