2012-04-05 14 views
9

Ich weiß, dass die Frage, die ich stellen werde, bereits von anderen Leuten verlangt wird, aber diese Antworten sind keine Lösung für mein Problem.Erhalten Sie Wert von versteckten Boundfield? ASP.NET

Ich habe eine Gridview mit 2 BoundFields, 2 ButtonFields und einem Kontrollkästchen (das ist ein TemplateField).

Ich habe auch eine Datentabelle, gefüllt mit Daten aus der Datenbank.

Im aspx-Code erstelle ich meine Gridview mit den Feldern, die das letzte BoundField Visible = false setzen.

In meinem Codebehind, füge ich die Spalten hinzu und binde die Datenquelle an meine Datentabelle.

Aber wenn ich versuche, die Daten aus dem ausgeblendeten Randbereich zu lesen, ist dieses Feld leer. Das Problem, warum ich die genannten Lösungen nicht mit ähnlichen Fragen verwenden kann, liegt darin, dass die Leute annehmen, dass die Daten einzeln ausgefüllt werden, und nicht, indem sie eine Datentabelle an die Datenquelle der Gridview binden.

Also meine Frage ist: Ist es eine Möglichkeit, die Daten aus dem ausgeblendeten Randbereich zu erhalten und behalten Sie auch die Möglichkeit, die Daten hinzuzufügen, indem Sie die Datentabelle an die Datenquelle der Gridview binden? Und wenn ja, ist es möglich, den Wert von diesem Feld zu bekommen?

p.s. Ich verwende 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> 

-Code Behind (wo ich das gridview füllen):

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

So, jetzt muss ich die Daten aus der Gridview (besonders aus dem ausgeblendeten Randbereich), da sie die Gridview mit Ausnahme des ausgeblendeten Randbereichs bearbeiten können, so dass nur so die ursprüngliche Zeile erkannt werden kann.

+0

Zeigen Sie uns Ihren Code. –

+0

Wann und wie liest du? – V4Vendetta

+0

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

Antwort

13

einen Datenschlüssel für die Spalte hinzufügen Sie erhalten müssen:

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

Sobald Sie den Datenschlüssel hinzugefügt haben, können Sie seinen Wert mit dem Zeilenindex zugreifen:

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

Vielen Dank, das hat mir geholfen! –

1

können Sie benutze diesen Code. Ich habe es getestet.

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

+0

Dies ist wirklich der sauberste Weg, den ich bisher gefunden habe. – ArtK

1

Eine weitere Option ist die Boundfield (oder jede andere Art von Spalte) sichtbar im Markup zu halten (Visible = False entfernen), und verwenden Sie das RowDataBound Ereignis, um die Spalten zu verstecken:

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

Alle Antworten sehen gut aus, aber diese Methode funktioniert am besten, wenn Sie bereits Code geschrieben haben und keine weiteren Änderungen vornehmen möchten –