Как выбрать видимые столбцы в Datagridview, привязанные к DataTable

У меня есть эти поля для Customer DataTable: ID, title, Name, Addrs, email, Fax и этот код для привязки DataGridView:

Dim sql As String = "SELECT * FROM Customers"
Dim daHeader As New SqlDataAdapter(sql, Conn)
daHeader.Fill(dsNota, "Customers")
dgvHeader.DataSource = dsNota.Tables("Customers")

Как просмотреть данные title,name,addrs в DataGridView без изменения строки SQL на:

"SELECT title,Name,Addrs FROM Customer"

person Lucky    schedule 22.05.2013    source источник
comment
Вам следует избегать синтаксиса SELECT *. Всегда указывайте нужные столбцы в каждом запросе.   -  person Neolisk    schedule 23.05.2013
comment
в моем случае есть столбец, который не нужно отображать, но спасибо за ваше предложение.   -  person Lucky    schedule 25.05.2013


Ответы (4)


Поэтому, если вы не хотите изменять строку запроса (как заметил @Neolisk, использование Select * обычно является плохой практикой, но это еще одно обсуждение), и поэтому вы получаете больше столбцов, чем то, что хотите отобразить:

Решение 1 (идеально, если в таблице данных много столбцов и вы хотите отобразить только некоторые из них)

  1. Вам необходимо установить AutoGenerateColumns в false. По умолчанию установлено значение True, поэтому DataGridView создаст столбец для всех столбцов в таблице данных.

  2. Затем вы добавляете DatagridiviewColumn для каждого столбца, который хотите отобразить.
    Чтобы не добавлять celltemplate для DatagriviewColumn (см. это), вы бы предпочли добавить строго типизированный столбец (DataGridViewTextBoxColumn, например, для отображения String значений). Чтобы связать столбец с источником, вы устанавливаете DataPropertyName, которое должно соответствовать ColumnName столбца inDataTable.

Итак, код будет:

dgvheader.AutoGenerateColumns = False
dgvHeader.Columns.Add(New DataGridViewTextBoxColumn() With {.HeaderText = "Title", .DataPropertyName = "title"}) 
dgvHeader.Columns.Add(New DataGridViewTextBoxColumn() With {.HeaderText = "Name", .DataPropertyName = "Name"}) 
dgvHeader.Columns.Add(New DataGridViewTextBoxColumn() With {.HeaderText = "Adresse", .DataPropertyName = "Addrs"}) 
dgvHeader.DataSource = dsNota.Tables("Customers")

Решение 2 (идеально, если в таблице данных много столбцов, и вы хотите скрыть только некоторые из них и сохранить преимущества AutoGenerateColumns)

  1. Установите AutoGenerateColumns в true (или ничего не делать, поскольку по умолчанию установлено значение True)

  2. Перехватите событие DataGridView.DataBindingComplete чтобы скрыть некоторые автоматически сгенерированные столбцы:

    Private Sub dataGridView1_DataBindingComplete(ByVal sender As Object, ByVal e As DataGridViewBindingCompleteEventArgs) Handles dgvHeader.DataBindingComplete   
        With dgvHeader
            .Columns("Fax").Visible = False
        End With
    End Sub
    
person Chris    schedule 24.05.2013
comment
Спасибо, Крис, попробую твоё предложение, - person Lucky; 25.05.2013

Если для атрибута gridview autogeneratecolumns установлено значение true, измените его на false, а затем сделайте так, как предложил Раймонд. Пример:

<asp:GridView ID="gvSearchResults" runat="server" AutoGenerateColumns="False">
        <Columns>
                <asp:BoundField DataField="title" HeaderText="Title" />
        </Columns>
</asp:GridView>
person Ashley Webb    schedule 23.05.2013
comment
В вопросе нет ссылки на ASP. Я бы предположил, что WinForms основан на имени класса DataGridView. - person Neolisk; 23.05.2013

Я знаю, что этот пост уходит далеко в прошлое, но у меня была такая же проблема на C#, и вот как я ее решил, и это работает очень хорошо.

1. Создайте набор данных с помощью SQL-запроса

     private void LoadDS()
     {
         // this method gets data from my database
         // DS is a DataSet in the properties of my form
         DS = LoadData();
     }

2. Отфильтруйте DataView так, как вы хотите

Для этого я использую свойство RowFilter DataView. Я создал метод GetFiltersToString(), который форматирует каждый имеющийся у меня элемент управления фильтром в строку, соответствующую синтаксису RowFilter (дополнительная информация о синтаксисе здесь и определение RowFilter в msdn здесь)

    public void RefreshDGV()
    { 
        // Get the corresponding dataview
        DV = new DataView(DS.Tables[0], rowFilter, "SORTINGCOLUMN Desc", DataViewRowState.CurrentRows);
        // Display it in a datagridview
        DGV.DataSource = DV;
    }

Я считаю, что это решение позволяет пользователю намного проще изменять фильтрацию.

person Moon Rat    schedule 29.06.2018

Вы должны явно добавить столбцы в свою сетку.

person Raimond Kuipers    schedule 22.05.2013
comment
Я думаю, что это должно дать информацию: code.msdn.microsoft.com/CSASPNETGridView-5b16ce70 - person Raimond Kuipers; 22.05.2013