Wie kann ich eine Spalte (GridView) ausblenden und trotzdem auf ihren Wert zugreifen?

77

Ich habe eine GridView mit einer DataSource(SQL-Datenbank). Ich möchte eine Spalte ausblenden, kann aber trotzdem auf den Wert zugreifen, wenn ich den Datensatz auswähle. Kann mir jemand zeigen, wie das geht?

Dies ist die Spalte, die ich ausblenden und trotzdem auf ihren Wert zugreifen möchte:

<asp:BoundField DataField="Outlook_ID" HeaderText="OutlookID" />

Ich habe alles versucht, um die Spalte (Eigenschaft Visible="false") auszublenden , aber ich kann nicht auf ihren Wert zugreifen.

Tassisto
quelle

Antworten:

44

Wenn ich mich nicht irre, haben GridViewdie Werte nicht BoundColumnsdas Attribut visible="false". Hier können Sie zwei Dinge tun, eines (wie in der Antwort von V4Vendetta erläutert) Datakeys. Oder Sie können Ihre BoundColumnzu a ändern TemplateField. Fügen Sie im ItemTemplateSteuerelement ein Steuerelement wie hinzu Label, machen Sie dessen Sichtbarkeit falsch und geben Sie dem Ihren Wert Label.

serhat_bundy
quelle
6
Dadurch wird die Spalte ausgeblendet, der Spaltenkopf jedoch nicht ausgeblendet. Wie wirst du das machen?
Apollo
2
Fügen Sie einfach <HeaderStyle CssClass = "hidden" /> in Ihr gebundenes Feld ein. Und definieren Sie einen CSS-Stil wie folgt: .hidden {display: none; }
Philippe
85
<head runat="server">
<title>Accessing GridView Hidden Column value </title>
<style type="text/css">
  .hiddencol
  {
    display: none;
  }
</style>

<asp:BoundField HeaderText="Email ID" DataField="EmailId" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol" >
</asp:BoundField>

ArrayList EmailList = new ArrayList();
foreach (GridViewRow itemrow in gvEmployeeDetails.Rows)
{
  EmailList.Add(itemrow.Cells[YourIndex].Text);
}
Mubashir Ahmed
quelle
Eine ausführliche Erläuterung dieser Lösung finden Sie unter netomatix.com/development/GridViewHideColumn.aspx .
Marcel
2
Diese Lösung hat den zusätzlichen Vorteil, dass die Daten auch auf der Clientseite weiterhin in Javascript verfügbar sind. Sollte die bevorzugte Lösung für dieses Problem sein!
Shaun Keon
42

Definieren Sie einen Stil in CSS:

.hiddencol { display: none; }

Fügen Sie dann das ItemStyle-CssClass="hiddencol"und das HeaderStyle-CssClass="hiddencol"Attribut zum Rasterfeld hinzu:

<asp:BoundField DataField="ID" HeaderText="ID" ItemStyle-CssClass="hiddencol"  HeaderStyle-CssClass="hiddencol" ClientIDMode="Static" />
Niloofar
quelle
Dies ist eine viel effektivere Antwort
ImCrimson
36

Sie können DataKeys zum Abrufen des Werts solcher Felder verwenden, da Sie (wie Sie sagten) beim Festlegen einer Normalen BoundFieldals sichtbares Falsch deren Wert nicht erhalten können.

Legen Sie in der .aspxDatei die GridViewEigenschaft fest

DataKeyNames = "Outlook_ID"

Jetzt können Sie in einem Ereignishandler wie folgt auf den Wert dieses Schlüssels zugreifen:

grid.DataKeys[rowIndex]["Outlook_ID"]

Dadurch erhalten Sie die ID am angegebenen Zeilenindex des Rasters.

V4Vendetta
quelle
1
DataKeys waren dafür gedacht
Antoine Pelletier
Wie würde dies funktionieren, wenn Sie DataSource-Steuerelemente mit CRUD-Code im HTML verwenden würden ...?
Hannington Mambo
23

Sie können dies programmgesteuert tun:

grid0.Columns[0].Visible = true;
grid0.DataSource = dt;
grid0.DataBind();
grid0.Columns[0].Visible = false;

Auf diese Weise setzen Sie die Spalte vor der Datenbindung auf sichtbar, damit die Spalte generiert wird. Wenn Sie festlegen, dass die Spalte nicht sichtbar ist, wird sie nicht angezeigt.

user496892
quelle
1
Ich arbeite überhaupt nicht und erhalte die ArrayOutOfBoundsException, wenn ich diesen Code in eine Panel PreRender-Methode einfüge.
Chexpir
2
Arbeitete für mich einfach und leicht.
RustyH
Dies ist bei weitem die beste Antwort.
Talha Imam
11

Wenn Sie ein TemplateFieldin Ihren Spalten haben GridViewund Sie beispielsweise ein Steuerelement namens blah daran gebunden haben. Dann platzieren Sie das outlook_idals HiddenFielddort wie folgt:

<asp:TemplateField HeaderText="OutlookID">
    <ItemTemplate>
        <asp:Label ID="blah" runat="server">Existing Control</asp:Label>
        <asp:HiddenField ID="HiddenOutlookID" runat="server" Value='<%#Eval("Outlook_ID") %>'/>
    </ItemTemplate>
</asp:TemplateField>

Nehmen Sie nun die Zeile für den gewünschten Fall outlook_idund greifen Sie auf das Steuerelement zu.
Für den RowDataBoundZugriff wie folgt:

string outlookid = ((HiddenField)e.Row.FindControl("HiddenOutlookID")).Value;

Kommen Sie zurück, wenn Sie Probleme beim Zugriff auf die angeklickte Zeile haben. Und vergessen Sie nicht, die Veranstaltung zu erwähnen, bei der Sie darauf zugreifen möchten.

Naveen
quelle
8

Sie können die Spalte hiddenauf der Serverseite aspxerstellen. Aus irgendeinem Grund unterscheidet sich dies von der Ausführung des Codes. Es kann immer noch referenziert werden, als ob es sichtbar wäre. Fügen Sie diesen Code einfach zu Ihrer OnDataBoundVeranstaltung hinzu.

protected void gvSearchResults_DataBound(object sender, EventArgs e)
{
    GridView gridView = (GridView)sender;

    if (gridView.HeaderRow != null && gridView.HeaderRow.Cells.Count > 0)
    {
        gridView.HeaderRow.Cells[UserIdColumnIndex].Visible = false;
    }

    foreach (GridViewRow row in gvSearchResults.Rows)
    {
        row.Cells[UserIdColumnIndex].Visible = false;
    }
}
Ben Foster
quelle
Das funktioniert. Für alle, die suchen, müssen Sie sicherstellen, dass sowohl die Kopfzeile als auch die Spalte mit der Rasteransicht ausgeblendet sind.
Danrex
4

Lassen Sie sichtbare Spalten, bevor Sie die füllen GridView. Füllen Sie GridViewdie Spalten aus und blenden Sie sie dann aus.

rube
quelle
2

So ermitteln Sie den Wert einer ausgeblendeten Spalte in einer GridView, die auf Folgendes festgelegt ist Visible=False: SpecialInstructionsFügen Sie in diesem Fall das Datenfeld zur DataKeyNames-Eigenschaft der gebundenen GridView hinzu und greifen Sie auf diese Weise darauf zu.

txtSpcInst.Text = GridView2.DataKeys(GridView2.SelectedIndex).Values("SpecialInstructions")

Das war's, es funktioniert jedes Mal sehr einfach.

Benchmark
quelle
2

Ich habe eine neue Lösung, um die Spalte auf der Clientseite mit CSS oder Javascript oder JQuery auszublenden .

.col0
{
  display: none;
}

Und in der Aspx-Datei, in der Sie die Spalte hinzufügen, sollten Sie die CSS-Eigenschaften angeben:

<asp:BoundField HeaderText="Address Key" DataField="Address_Id" ItemStyle-CssClass="col0" HeaderStyle-CssClass="col0" > </asp:BoundField>
Mukund
quelle
1

Ich habe eine ähnliche Methode wie user496892 verwendet:

SPBoundField hiddenField = new SPBoundField();
hiddenField.HeaderText = "Header";
hiddenField.DataField = "DataFieldName";
grid.Columns.Add(hiddenField);

grid.DataSource = myDataSource;
grid.DataBind();

hiddenField.Visible = false;
Amy Struck
quelle
0

Sie können es Code hinter tun.

Set visible= falsefür Spalten nach Datenbindung. Danach können Sie die Sichtbarkeit " true " in der Funktion row_selection in der Rasteransicht erneut ausführen. Es wird funktionieren !!

Abhisek
quelle
0

Wenn ich Zugriff möchte, wird ein Wert von GridViewzuvor GridViewangezeigt.

  1. Ich habe eine BoundFieldund binde DataFieldnominell.
  2. In diesem RowDataBoundFall mache ich einen Prozess in diesem Fall.
  3. Bevor GridViewes erscheint, schreibe ich Folgendes:

    protected void GridviewLecturer_PreRender(object sender, EventArgs e) 
    {
        GridviewLecturer.Columns[0].Visible = false;
    }
    
Mitr Raiputta
quelle