2011-10-06 12 views
5

Mi dispiace per il codice precedente. Qualcuno potrebbe aiutarmi? Ho un GridView GridView1 che è popolata sulla PageLoad() importando da foglio Excel che ha tre colonne:Impossibile ottenere valori dalle caselle di testo in templateField all'interno di gridview

  1. Data
  2. clienti
  3. PayingBookNoOrDD

Il foglio ha cinque righe. Gli utenti possono modificare i dati nelle caselle di testo sulla pagina (markup sotto). Dopo la modifica, quando l'utente fa clic sul pulsante di invio, ho bisogno di ottenere questi nuovi valori da tutte le caselle di testo e di aggiornare lo stesso foglio Excel da dove è stato popolato il numero GridView.

Ho creato tre string array: dateArray, custArray e payingInBookArray per memorizzare questi nuovi valori. Ma quando eseguo l'applicazione, tutti e tre gli array sono vuoti.

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

Codice-behind:

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

} 

Per favore fatemi sapere se qualcuno ha una soluzione.

Grazie.

+0

prega i tuoi esempi di codice ... modo troppo per modificare – CAbbott

+0

Hi CAbbott pulire-up, mi dispiace nuovo a questo sito. Ho provato a modificare la domanda ma è diventata ancora più caotica. Per favore dammi qualche minuto e lo aggiusterò. – Amol

+0

Non chiamare i tuoi pulsanti 'txtSubmit' o qualcosa che precede un' txt' se è davvero un pulsante 'btn', può essere molto fuorviante. Dovresti anche avvolgere il tuo oggetto di connessione usando l'istruzione 'using', in questo modo non devi chiamare' .dispose() 'esplicitamente. – JonH

risposta

0

Aggiungi un controllo postback sul tuo evento Page_Load. Non riesco a vedere nulla di sbagliato con il tuo codice 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

Personalmente, vorrei cambiare la funzione txtSubmit_Click a questo:

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

} 

Ho sempre avuto problemi cercando di accedere direttamente i valori della collezione .Cells. Cosa succede quando si chiama .FindControl sulla riga stessa?

Come altri hanno già detto, vale la pena di pensare a nuovi nomi per i campi HTML e le variabili. Sembra banale ora avere DateArray di tipo IList, ma mi ha brevemente lanciato per un ciclo per vedere DateArray.ToArray(). Convenzioni di denominazione e altre piccole modifiche al codice sorgente non ti porteranno molto tempo per sistemare ora, ma ti faranno risparmiare tempo dopo quando dovrai rivisitare questo codice dopo settimane o mesi di lavoro su altri progetti.

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

End Sub