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.

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.


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

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

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.


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.


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.


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;
    }
}

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.


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.


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>

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;

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 !!


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;
    }
    
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.