2012-04-05 15 views
9

Wiem, że pytanie, które zamierzam zadać, jest już zadawane przez inne osoby, ale te odpowiedzi nie stanowią rozwiązania mojego problemu.Uzyskaj wartość z ukrytego ograniczenia? ASP.NET

mam gridview zawierający 2 BoundFields, 2 ButtonFields i pole (pola wyboru który TemplateField).

Mam również datatable, wypełnione danymi z bazy danych.

W kodzie aspx tworzę moje gridview z pól ustawić ostatni BoundField Visible = false.

W moim kodzie źródłowym dodaję kolumny i wiążę źródło danych z moim datatable.

Ale kiedy próbuję odczytać dane z ukrytego pola, to pole jest puste. Problem polegający na tym, że nie mogę skorzystać z rozwiązań wspomnianych w podobnych pytaniach, polega na tym, że ludzie zakładają, że dane są wypełniane jeden po drugim, a nie wiążą dane z danymi źródłowymi gridview.

Moje pytanie brzmi: Czy jest to sposób na uzyskanie danych z ukrytego pola, a także możliwość dodania danych przez powiązanie datatable ze źródłem danych gridview? A jeśli tak, to czy można uzyskać wartość z tego pola?

p.s. Używam asp.net/c# w 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 (gdzie ja wypełnić 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(); 
} 

Więc teraz muszę się dostać dane z widoku siatki (escpecialy z ukrytego pola), ponieważ mogą edytować widok siatki poza ukrytym obszarem, więc jest to jedyny sposób na sprawdzenie, który oryginalny wiersz był.

+0

Pokaż nam swój kod. –

+0

Kiedy i jak się czytasz? – V4Vendetta

+0

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

Odpowiedz

13

Dodawanie klucza danych dla kolumny trzeba uzyskać:

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

Po dodaniu datakey, można uzyskać dostęp do jego wartości z indeksem rzędu:

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

Dziękuję bardzo, pomogło mi to! –

1

można użyj tego kodu. testowałem to.

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

+0

To jest naprawdę najczystszy sposób, jaki znalazłem do tej pory. – ArtK

1

Inną opcją jest utrzymanie BoundField (lub dowolny inny typ kolumny) widoczne w znacznikach (usunąć Visible = False) i użyć zdarzenia RowDataBound ukryć kolumny:

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

Wszystkie odpowiedzi wyglądają dobrze, ale ta metoda działa najlepiej, jeśli już napisałeś kod i nie chcesz robić innych zmian –

Powiązane problemy