2016-03-21 16 views
1

Hallo Ich möchte meine gridview von einer Datentabelle binden, die ich selbst erstelle.Bind Gridview mit Artikeln asp.net

Es funktioniert, aber meine Spalten sind doppelt, ich verstehe nicht genau warum.

Hier ist meine gridview:

<asp:GridView runat="server" ID="GvCalculSelect" CssClass="gridView" HorizontalAlign="Center"> 
       <Columns> 
        <asp:BoundField DataField="CalculName" HeaderText="CalculName" /> 
        <asp:TemplateField HeaderText="ResultValue"> 
         <ItemTemplate> 
          <asp:CheckBox ID="CbResultValue" runat="server" Checked='<%# Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "ResultValue").ToString()) %>'/> 
         </ItemTemplate> 
        </asp:TemplateField> 
       </Columns> 
      </asp:GridView> 

Und hier ist es ein Teil meines cs Code:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     BindGrid(); 
    } 
} 

protected void BindGrid() 
{ 
    DataTable dt = new DataTable(); 
    dt.Columns.Add(new DataColumn("CalculName", typeof(string))); 
    dt.Columns.Add(new DataColumn("ResultValue", typeof(Boolean))); 
    dt.Rows.Add("Test", true); 
    GvCalculSelect.DataSource = dt; 
    GvCalculSelect.DataBind(); 
} 

Das Ergebnis ist:
enter image description here

Wie es zu beheben? Ich denke, wenn ich meine Gridview fessele, nehme ich meine zwei "dt.columns.add". Ich will nur mein calculName Feld und mein Result Checkbox halten

Danke für Ihre Hilfe

+0

stellen Sie sicher, dass Ihre automatisch generierten Spalten auf false gesetzt ist. auch auf die Bind() -Methode fügen Sie dies als Ihre erste Zeile 'GvCalculSelect.DataSource = null;' – MethodMan

Antwort

2

Dies geschieht, weil Sie Ihre eigene Tabelle erstellen und an dem Gridview-Bindung und die Definition von 2 Spalten explizit in der Gridview und Datenfelder an sie binden.

Tun Sie 1 oder das andere, aber nicht beides. Also, um klar zu sein, wenn Sie das Aussehen Ihrer Spalten steuern möchten, sollten Sie die autogeneratecolumns Eigenschaft auf false setzen. Behalten Sie Ihre Front-End-gebundenen Spalten bei, aber Sie können sie dann aus der Datentabelle entfernen und einfach auf die relevanten Felder verweisen, die in der Datentabelle vorhanden sind.

Alternativ setzen Sie autogeneratecolumns auf True, aber konstruieren Sie dann die Spalten in Ihrer Datentabelle in Ihrem Code hinter und binden Sie sie dann einfach so wie sie sind.

+0

Ja, das ist ich denke, aber ich habe keine Ahnung, die Daten direkt in meine Gridview einfügen, ohne durch eine Datentabelle, die ich Erstelle mich selbst – Ironboy07

+0

@ Ironboy07 - klingt wie Sie wollen etwas Kontrolle darüber, wie die Spalten aussieht usw. So müssen Sie keine neuen Spalten in Ihrer Datentabelle erstellen. Setzen Sie autogeneratecolumns auf false und füllen Sie einfach die Datentabelle, binden Sie sie und verwenden Sie dann das Feld boundfield und template, um auf die korrekten Daten zu verweisen. – sr28

+0

Ja danke, es funktioniert. Ich habe nur die autogeneratecolumns auf false gesetzt, wie du gesagt hast. Ich habe diesen Parameter vergessen ... Danke für deine schnelle Antwort! – Ironboy07

1

Dies liegt daran, GridView.AutoGenerateColumns Property

Sie müssen ihren Wert false setzen.

Für Ihre refrence nach MSDN

Wenn Sie diese Eigenschaft auf true gesetzt und stellen Sie die ItemType Eigenschaft auf einen Modelltyp werden Dynamic Kontrollen erzeugt. Wenn Sie die ItemType-Eigenschaft nicht festlegen, werden BoundField-Steuerelemente generiert. Wenn Sie nicht Dynamic Kontrollen möchten, haben Sie folgende Möglichkeiten:

  1. die ColumnsGenerator Eigenschaft auf null im Falle Handler Page_Load ein. In diesem Fall werden BoundField-Steuerelemente generiert.

  2. Schreiben Sie benutzerdefinierten Code zum automatischen Generieren von Feldern durch Erstellen und Zuweisen einer eigenen ColumnsGenerator-Klasse und Zuweisen einer Instanz an das Steuerelement.

  3. Setzen Sie AutoGenerateColumns auf false. In diesem Fall werden keine Felder generiert, und Sie müssen Felder manuell mit Steuerelementen wie als BoundField oder ImageField angeben.

  4. Legen Sie die ItemType-Eigenschaft nicht fest. In diesem Fall werden die BoundField-Steuerelemente generiert.