2012-04-05 14 views
9

So che la domanda che sto per porre è già stata richiesta da altre persone, ma quelle risposte non sono una soluzione per il mio problema.Ottieni valore dal boundfield nascosto? ASP.NET

Ho un gridview contenente 2 BoundFields, 2 ButtonFields e un campo checkbox (che è un TemplateField).

Ho anche un datatable, pieno di dati dal database.

Nel codice aspx creo il mio gridview con i campi impostati l'ultimo BoundField Visible = false.

Nel mio codebehind, aggiungo le colonne e associo l'origine dati al mio datatable.

Ma quando provo a leggere i dati dal campo nascosto, quel campo è vuoto. Il problema per cui non posso usare le soluzioni menzionate con domande simili è perché le persone presuppongono che i dati vengano riempiti uno per uno e non vincolando un datatable all'origine dati di gridview.

Quindi la mia domanda è: è un modo per ottenere i dati dal campo nascosto e conservare anche la possibilità di aggiungere i dati associando il datatable all'origine dati del gridview? E se sì, è possibile ottenere il valore da quel campo?

p.s. Sto utilizzando asp.net/c# in Visual Studio 2010

ASPX:

<asp:GridView ID="gvSelect" runat="server" AutoGenerateColumns="False" BorderStyle="None" onrowcommand="gvTestSelect_RowCommand"> 
    <Columns> 
     <asp:TemplateField> 
      <HeaderTemplate> 
       <asp:CheckBox runat="server" ID="cbHeader" OnPreRender="cbHeader_PreRender" /> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <asp:CheckBox runat="server" ID="cbItems" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField DataField="field" HeaderText="Veld" SortExpression="field" /> 
     <asp:ButtonField DataTextField="up" HeaderText="Omhoog" SortExpression="up" CommandName="up" Text="&uarr;" /> 
     <asp:ButtonField DataTextField="down" HeaderText="Omlaag" SortExpression="down" CommandName="down" Text="&darr;" /> 
     <asp:BoundField DataField="hidden" SortExpression="hidden" /> 
    </Columns> 
</asp:GridView> 

codice sottostante (dove riempio il gridview):

//create array list and fill it with all columns 
Dictionary<string, string> dict = FillLists.getColumnsByTable(loader, ddlInfoTableI.SelectedItem.Value.ToString()); 

//loop trough dictionary 
foreach (var val in dict) 
{ 
    //create new dtSelect datarow 
    DataRow dr = dtSelect.NewRow(); 

    //set row values for column values 
    dr["select"] = false; 
    dr["field"] = val.Value.ToString(); 
    dr["up"] = new ButtonField { CommandName = "up", Text = loader.LoadResourceString(1024), HeaderText = "&uarr;", ButtonType = ButtonType.Button, Visible = true }; 
    dr["down"] = new ButtonField { CommandName = "down", Text = loader.LoadResourceString(1025), HeaderText = "&darr;", ButtonType = ButtonType.Button, Visible = true }; 
    dr["hidden"] = val.Key.ToString(); 

    //add the datarow 
    dtSelect.Rows.Add(dr); 

    //set datatable session to datatable 
    Session["dtSelect"] = dtSelect; 

    //set datasource of the gridview to datatable 
    gvSelect.DataSource = dtSelect; 

    //bind data to gridview 
    gvSelect.DataBind(); 
} 

Così ora ho bisogno di ottenere il i dati di gridview (escorteticamente dal campo di delimitazione nascosto), perché possono modificare il gridview eccetto il campo di delimitazione nascosta, quindi questo è l'unico modo per sapere quale riga originale era.

+0

Mostraci il tuo codice. –

+0

Quando e come stai leggendo? – V4Vendetta

+0

** http: //stackoverflow.com/faq#howtoask** –

risposta

13

aggiungere una chiave di dati per la colonna è necessario per ottenere:

<asp:GridView ID="GridView1" runat="server" DataKeyNames="hidden" ...> 

Dopo aver aggiunto il DataKey, è possibile accedere il suo valore con l'indice di riga:

var rowIndex = 0; 
var hiddenValue = (string)GridView1.DataKeys[rowIndex]["hidden"]; 
+0

Grazie mille, questo mi ha aiutato! –

1

è possibile usa questo codice l'ho provato

TextBox1.Text = GridView1.DataKeys[e.NewSelectedIndex].Value.ToString();

+0

Questo è davvero il modo più pulito che ho trovato finora. – ArtK

1

Un'altra opzione è quella di mantenere la BoundField (o qualsiasi altro tipo di colonna) visibile nella marcatura (rimuovere Visible = False), e utilizzare l'evento RowDataBound per nascondere le colonne:

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    e.Row.Cells[COLUMN_USERID].Visible = false; 
} 
+1

Tutte le risposte sembrano buone, ma questo metodo funziona meglio se hai già scritto codice e non vuoi fare altre modifiche –

Problemi correlati