none
ASP.NET GRIDVIEW заголовки столбцов в виде DropDownList. Получить значения. RRS feed

  • Общие обсуждения

  • Добрый день,

    Никак не получается получить выбранные значения динамически созданных DropDownList:

    Загружаю Excel файл в GridView, количество колонок в Excel и название может быть любое. Вместо названия колонок в Gridview использую DropDownList c фиксированным набором значений. Значения DropDownList это название колонок в таблице базы данных, в которую импортируется данные из Excel.

    Вот код DropDownList создаются, но значения не могу их получить. Возможно это можно реализовать без динамических DropDownList, но у меня не получилось, буду очень признателен за помощь.

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Suppliers.aspx.vb" Inherits="Suppliers" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <style>
            
        </style>
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <div style="background-color: ActiveCaption">
                    <p></p>
                    <asp:FileUpload BorderColor="Black" Width="250" ID="FileUpload1" runat="server" />
                    <asp:Button ID="Button1" runat="server" Text="Выбрать" />
                    <asp:Button ID="Button2" runat="server" Text="Найти DropDownList" />
                    <asp:Label ID="Label2" runat="server" Text=""></asp:Label>
                </div>
                <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
                <p></p>
                <asp:GridView ID="GridView1" runat="server" BackColor="White" BorderColor="White" BorderStyle="Ridge" BorderWidth="2px" CellPadding="3" CellSpacing="1" GridLines="None" AutoGenerateColumns="true">
                    <FooterStyle BackColor="#C6C3C6" ForeColor="Black" />
                    <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#E7E7FF" Width="150" />
                    <PagerStyle BackColor="#C6C3C6" ForeColor="Black" HorizontalAlign="Right" />
                    <RowStyle BackColor="#DEDFDE" ForeColor="Black" Font-Size="Small" />
                </asp:GridView>
            </div>
        </form>
    
    </body>
    </html>
    Imports System.Data.OleDb
    Imports System.Data
    Imports System.Data.SqlClient
    
    Partial Class Suppliers
        Inherits System.Web.UI.Page
        Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim fileLocation As String
            If FileUpload1.HasFile Then
                Try
                    FileUpload1.SaveAs(Server.MapPath("~/ExportFolder/") & _
                       FileUpload1.FileName)
                    fileLocation = Server.MapPath("ExportFolder") & "\" & FileUpload1.FileName
                    Dim ds As DataSet = New DataSet
                    Dim excelConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties='Excel 12.0;HDR=No;IMEX=2'"
                    'Create Connection to Excel work book and add oledb namespace
                    Dim excelConnection As OleDbConnection = New OleDbConnection(excelConnectionString)
                    Dim query As String = "SELECT * FROM [A2:O10]"
                    Dim dataAdapter As OleDbDataAdapter = New OleDbDataAdapter(query, excelConnection)
                    dataAdapter.Fill(ds)
                    GridView1.DataSource = ds.Tables(0)
                    GridView1.DataBind()
                Catch ex As Exception
                    Label1.Text = "ERROR: " & ex.Message.ToString()
                End Try
            Else
                Label1.Text = "You have not specified a file."
            End If
        End Sub
    
        Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Dim str As String = ""
            Dim col As Integer = CType(Session("col"), Byte)
            For i As Byte = 1 To col
                Dim DrDnListF As DropDownList = CType(GridView1.FindControl("F" & i), DropDownList)
                If Not (DrDnListF Is Nothing) Then str = str & "<br/>" & DrDnListF.SelectedValue & " " & i
            Next
            Session("col") = 0
            Label2.Text = str
        End Sub
    
        Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
            If (e.Row.RowType = DataControlRowType.Header) Then
                Dim tbl As DataTable = GridView1.DataSource
                Dim items(3) As ListItem
                items(0) = New ListItem("", "0")
                items(1) = New ListItem("Артикул", "1")
                items(2) = New ListItem("Наименование", "2")
                items(3) = New ListItem("Цена", "3")
                For i As Byte = 0 To tbl.Columns.Count - 1
                    e.Row.Cells(i).Width = "150"
                    Dim DrDnList As New DropDownList
                    DrDnList.Items.AddRange(items)
                    DrDnList.ID = "F" & i
                    DrDnList.BorderColor = Drawing.Color.AliceBlue
                    DrDnList.Width = "150"
                    e.Row.Cells(i).Controls.Add(DrDnList)
                Next
                Session("col") = tbl.Columns.Count
            End If
    
        End Sub
    
    End Class




    5 января 2015 г. 10:34

Все ответы

  • Вам надо реализовать нечто подобное:

    foreach(GridViewRow gdv in GridView1.Rows){
         if (gdv.RowType == DataControlRowType.Header)
         {
             var control = (ControlType)gdv.HeaderRow.FindControl("ControlId");
         }
    }


    Сделаем содержимое сообщества лучше, вместе!

    5 января 2015 г. 10:42
    Модератор
  • Спасибо большое попробую.
    5 января 2015 г. 10:46
  • Не получилось, получается , что в GridView1.Rows нету строки типа DataControlRowType.Header

    Посмотрите, пожалуйста, может что то не понимаю


            For Each gdvr As GridViewRow In GridView1.Rows
                If gdvr.RowType = DataControlRowType.Header Then
                    Dim DropDownList As Control = CType(gdvr.FindControl("F0"), DropDownList)
                End If
                i = i + 1
            Next

    Взял Id из кода в баузере id="GridView1_F0"

    И попробовал найт, но тоже не находит. Может проблема в том что DropDownList динамически созданы поздно? А как раньше не пойму.

    Dim DropDownList As Control = CType(gdvr.FindControl("GridView1_F0"), DropDownList)



    • Изменено monteloro 5 января 2015 г. 14:57
    5 января 2015 г. 11:09
  • Вот такая конструкция  находит контролы в строке заголовка, если они созданы через шаблон

                    <Columns>
                        <asp:TemplateField>
                            <HeaderTemplate>
                                <asp:DropDownList ID="DropDownList1" runat="server">
                                    <asp:ListItem Text="Артикул" Value="1" />
                                </asp:DropDownList>
                            </HeaderTemplate>
                        </asp:TemplateField>
                    </Columns>

    а вот динамические не находит

    Dim DropDownListF As DropDownList = GridView1.HeaderRow.FindControl("ControlId")
    5 января 2015 г. 14:35
  • Вы указывайте "DropDownList1" т.е. то, что указываете на сервере, взятый из браузера Id не подходит.

    Сделаем содержимое сообщества лучше, вместе!

    5 января 2015 г. 15:28
    Модератор
  • Спасибо это я понимаю, я когда указываю напрямую Id взятый из браузера - я использую 

    FindControl("ControlId")

    а когда

    Dim DropDownListF As DropDownList = GridView1.HeaderRow.FindControl("DropDownList1")

    я о другом, я делаю перебор всех контролов заголовка, но могу найти только контроллы предустановленные в шаблоне, динамические контроллы я не нахожу, и не понимаю, как получить из них значения, при постбаке они разрушаются:

        Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Dim str As String = ""
    
            For Each HeadCell As TableCell In GridView1.HeaderRow.Cells
                For Each ctrl As Control In HeadCell.Controls
                    str = str & " " & ctrl.ID
                Next
            Next
            Label2.Text = str
        End Sub


    • Изменено monteloro 6 января 2015 г. 9:58
    5 января 2015 г. 16:44
  • Хорошо, как будет время посмотрю более детально. А пока учтите, что контролы не ищутся по всей иерархии деререва, возможно он находится на других уровнях. Чтобы облегчить поиск есть рекурсивный вариант поиска.

    Сделаем содержимое сообщества лучше, вместе!

    7 января 2015 г. 6:26
    Модератор
  • Да спасибо большое, по поводу рекурсивного варианта, очень полезное замечание.
    7 января 2015 г. 9:06