Export Only Visible Columns To SqlBulkCopy

I am using C# to conditionally show columns in a asp:gridview based off the selction of a checkbox list. Now all columns are loaded, as the asp:gridview is populated on page_load() but is not actually displayed until the user selects what columns to view from the checkbox list.

I have been utilizing this JQUERY to get the data from the asp:gridview when all columns are visible - but how could this be tweaked to only pull the data that is visible?

var information = [];
$('[id*=GridView2]').find('tr:has(td)').each(function () {
    var information = {};
    information.field1 = $(this).find("td:nth-child(1)").html();
    information.field2 = $(this).find("td:nth-child(2)").html();
    information.field3 = $(this).find("td:nth-child(3)").html();

And below is html/C#

<asp:GridView ID="GridView2" runat="server" CssClass="Grid" AutoGenerateColumns="false"> 
<HeaderStyle BackColor="#ffbf00" />
        <asp:BoundField DataField="Field1" HeaderText="Field1" HeaderStyle-Width="50%"></asp:BoundField>
        <asp:BoundField DataField="Field2" HeaderText="Field2" HeaderStyle-Width="8%"></asp:BoundField>
        <asp:BoundField DataField="Field3" HeaderText="Field3" HeaderStyle-Width="8%"></asp:BoundField>

protected void checkboxlist_SelectedIndexChanged(object sender, EventArgs e)
    var items = checkboxlist.Items;
private int GetColumnIndex(GridView grid, string ColName)
    foreach (DataControlField col in grid.Columns)
        if (col.HeaderText.ToLower().Trim() == ColName.ToLower().Trim())
            return grid.Columns.IndexOf(col);
    return -1;
protected void btnShowMe_Click(object sender, EventArgs e)
    var columnname = string.Empty;
    foreach (System.Web.UI.WebControls.ListItem item in checkboxlist.Items)
        columnname = item.Text;

        var headergrid = GetColumnIndex(GridView2, columnname);
        string number = headergrid.ToString();
            GridView2.Columns[headergrid].Visible = item.Selected;