2014-09-20 4 views
0

У меня есть этот DropDownList:ИНЕКЕ с DropDownList выбранного значения

<asp:DropDownList ID="ddlEvents" runat="server" AppendDataBoundItems="True" 
    AutoPostBack="True" Width="140px"> 
    <asp:ListItem Value="0">Choose Location</asp:ListItem> 
    </asp:DropDownList> 

Над DROPDOWNLIST вариантов динамически заполняется из базы данных.

Тогда у меня есть это на коде:

Public Sub BindGrid() 
     Dim oconn As New SqlConnection(sqlconn) 
     AddHandler ddlLocation.SelectedIndexChanged, New EventHandler(AddressOf ddl_SelectedIndexChanged) 
     oconn.Open() 
     Dim ocmd As New SqlCommand("select e.eventsId,e.Location, dbo.fnFormatDate(t.trainingDates, 'MON/DD/YYYY') t.eventDates, t.eventTime,t.eventDescription from tblEvents e, tblEventgDates t where e.eventid = t.eventid and e.eventid = " & ddlEvents.SelectedValue, oconn) 
     Dim oda As New SqlDataAdapter(ocmd) 
     Dim builder As New SqlCommandBuilder(oda) 
     Dim ds As New DataSet() 
     oda.Fill(ds) 
     gv1.DataSource = ds 
     gv1.DataBind() 

End Sub 

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

Код выше ничего не делает.

Я подозреваю, что мне нужен selectedIndexChanged?

Но как я могу включить его в событие BindData()?

Спасибо большое заранее

Imports System.Collections.Generic 
Imports System.Linq 
Imports System.Web 
Imports System.Web.UI 
Imports System.Web.UI.WebControls 
Imports System.Data 
Imports System.Configuration 
Imports System.Data.SqlClient 

Partial Class Events 
    Inherits System.Web.UI.Page 
    Private sqlconn As String = ConfigurationManager.ConnectionStrings("DBConnectionString").ToString() 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load 
     If Not IsPostBack Then 
      BindGrid() 
     End If 
     PopulateDates() 
    End Sub 
    Public Sub BindGrid() 
     Dim oconn As New SqlConnection(sqlconn) 
     ' AddHandler ddlEvents.SelectedIndexChanged, New EventHandler(AddressOf ddl_SelectedIndexChanged) 
     oconn.Open() 
     Dim ocmd As New SqlCommand("select e.eventsId,e.Location, dbo.fnFormatDate(t.trainingDates, 'MON/DD/YYYY') t.eventDates, t.eventTime,t.eventDescription from tblEvents e, tblEventgDates t where e.eventid = t.eventid and e.eventid = " & ddlEvents.SelectedValue, oconn) 
     Dim oda As New SqlDataAdapter(ocmd) 
     Dim builder As New SqlCommandBuilder(oda) 
     Dim ds As New DataSet() 
     oda.Fill(ds) 
     gv1.DataSource = ds 
     gv1.DataBind() 

    End Sub 

    Protected Sub gv1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) 
     Dim oconn As New SqlConnection(sqlconn) 
     oconn.Open() 
     Dim ocmd As New SqlCommand("SELECT* FROM Events", oconn) 
     Dim oda As New SqlDataAdapter(ocmd) 
     Dim builder As New SqlCommandBuilder(oda) 
     Dim ds As New DataSet() 
     oda.Fill(ds) 
     Dim ddl As DropDownList = DirectCast(e.Row.FindControl("ddlInstructors"), DropDownList) 
     If ddl IsNot Nothing Then 
      ddl.DataSource = ds 
      ddl.DataValueField = "EventsId" 
      ddl.DataTextField = "EventName" 
      ddl.DataBind() 
     End If 
     If e.Row.RowType = DataControlRowType.Footer Then 
      Dim ddldesig As DropDownList = DirectCast(e.Row.FindControl("ddladddesig"), DropDownList) 
      ddldesig.DataSource = ds 
      ddldesig.DataValueField = "EventsId" 
      ddldesig.DataTextField = "EventName" 

      ddldesig.DataBind() 
     End If 
    End Sub 

    Protected Sub gv1_RowDeleting(ByVal sender As Object, ByVal e As GridViewDeleteEventArgs) 
     Dim EID As Integer = Convert.ToInt32(gv1.DataKeys(e.RowIndex).Value) 
     Dim oconn As New SqlConnection(sqlconn) 
     oconn.Open() 
     Dim ocmd As New SqlCommand() 
     ocmd.CommandText = "DELETE FROM Events WHERE [email protected]" 
     ocmd.Parameters.AddWithValue("@EID", EID) 
     ocmd.Connection = oconn 
     ocmd.ExecuteNonQuery() 
     oconn.Close() 
     BindGrid() 

    End Sub 

    Protected Sub gv1_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs) 
     gv1.EditIndex = e.NewEditIndex 
     BindGrid() 
    End Sub 


    Protected Sub gv1_RowUpdating(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs) 
     Dim EID As Integer = Convert.ToInt32(gv1.DataKeys(e.RowIndex).Value) 
     'Dim ENAME As String = DirectCast(gv1.Rows(e.RowIndex).Cells(1).FindControl("txtename"), TextBox).Text 
     Dim DESIGID As Integer = Integer.Parse(DirectCast(gv1.Rows(e.RowIndex).Cells(1).FindControl("ddlInstructors"), DropDownList).SelectedValue) 
     Dim oconn As New SqlConnection(sqlconn) 
     oconn.Open() 
     Dim ocmd As New SqlCommand() 
     ocmd.CommandText = "UPDATE MainEvents SET [email protected] WHERE [email protected] " 
     ocmd.Parameters.AddWithValue("@EID", EID) 
     ocmd.Parameters.AddWithValue("@DESIGID", DESIGID) 
     ocmd.Connection = oconn 
     ocmd.ExecuteNonQuery() 
     gv1.EditIndex = -1 
     BindGrid() 
    End Sub 

    Protected Sub gv1_RowCancelingEdit(ByVal sender As Object, ByVal e As GridViewCancelEditEventArgs) 
     gv1.EditIndex = -1 
     BindGrid() 
    End Sub 
    Public Sub PopulateDates() 
     Dim cmd As New SqlCommand("Select EventsId, eventName from tblEvents order by location asc", New SqlConnection(ConfigurationManager.ConnectionStrings("DBConnectionString").ConnectionString)) 
     cmd.Connection.Open() 
     ddlEvents.Items.Clear() 
     Dim ddlValues As SqlDataReader 
     ddlValues = cmd.ExecuteReader() 

     ddlEvents.DataSource = ddlValues 
     ddlEvents.DataValueField = "EventsId" 
     ddlEvents.DataTextField = "EventName" 
     ddlEvents.DataBind() 

     cmd.Connection.Close() 
     cmd.Connection.Dispose() 
    End Sub 
    Protected Sub GridView1_RowUpdated(ByVal sender As Object, ByVal e As GridViewUpdatedEventArgs) 

     ' Indicate whether the update operation succeeded. 
     If e.Exception Is Nothing Then 
      Dim index As Integer = gv1.EditIndex 
      Dim row As GridViewRow = gv1.Rows(index) 
      Message.Text = "Row updated successfully'!" 
     Else 
      e.ExceptionHandled = True 
      Message.Text = e.Exception.Message 
     End If 
    End Sub 
End Class 

ответ

0

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

Добавлено onselectedindexchanged к DropDownList

<asp:DropDownList ID="ddlEvents" runat="server" AutoPostBack="True" Width="140px" onselectedindexchanged="ddlEvents_SelectedIndexChanged" > 
    <asp:ListItem Value="0">Choose Location</asp:ListItem> 
    </asp:DropDownList> 

Создан SelectedIndexChange к югу и к югу под названием BindGrid оттуда:

Protected Sub ddlEvents_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) 
     BindGrid() 
    End Sub 

И решить мою проблему.

0

Чтобы ответить на ваш вопрос прямо, возьмите код ДобавитьОбработчик в BindGrid(). Добавить параметры в BindGrid(), необходимые для выбранного индекса изменились события и проволоки до событий в разметке:

<asp:DropDownList ID="ddlEvents" runat="server" AppendDataBoundItems="true" AutoPostBack="true" OnSelectedIndexChanged="BindGrid"> 
      <asp:ListItem Value="0">Choose Location</asp:ListItem> 
     </asp:DropDownList> 


    Public Sub BindGrid(ByVal Sender As Object, ByVal e As EventArgs) 
     Dim oconn As New SqlConnection(sqlconn)   
     oconn.Open() 
     Dim ocmd As New SqlCommand("select e.eventsId,e.Location, dbo.fnFormatDate(t.trainingDates, 'MON/DD/YYYY') t.eventDates, t.eventTime,t.eventDescription from tblEvents e, tblEventgDates t where e.eventid = t.eventid and e.eventid = " & ddlEvents.SelectedValue, oconn) 
     Dim oda As New SqlDataAdapter(ocmd) 
     Dim builder As New SqlCommandBuilder(oda) 
     Dim ds As New DataSet() 
     oda.Fill(ds) 
     gv1.DataSource = ds 
     gv1.DataBind() 
    End Sub 

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

<asp:DropDownList ID="ddlEvents" runat="server" AppendDataBoundItems="true" AutoPostBack="true" > 
     <asp:ListItem Value="0">Choose Location</asp:ListItem> 
</asp:DropDownList> 

Markup вашей сетки, как это с DataSourceID ссылкой на SqlDataSource (как показано ниже):

<asp:GridView ID="gridView1" runat="server" DataSourceID="GridSqlSrc"> 
</asp:GridView> 

И, наконец, создать SqlDataSource для вашей сетки и настроить его с параметр (предотвращает атаки SQL Injection), которая автоматически вытаскивает из вашего DropDownList:

<asp:SqlDataSource runat="server" 
SelectCommand="SELECT e.eventsId, e.Location, fnFormatDate(t.trainingDates, 'MON/DD/YYYY') t.eventDates, t.eventTime,t.eventDescription from tblEvents e, tblEventgDates t where e.eventid = t.eventid and e.eventid = @eventId)"> 
<SelectParameters> 
    <asp:ControlParameter ControlID="ddlEvents" PropertyName="SelectedValue" Name="@eventId" /> 
</SelectParameters>    

Теперь, когда пользователь выбирает из DropDownList, сетка автоматически запрашивает и связывает данные.

+0

благодарит за предлагаемые решения. Мне нравится первое решение, но оно не работает. Во-первых, я выбираю параметр из раскрывающегося списка и не отображает связанные с ним записи. Во-вторых, когда я выбираю параметр, он сразу возвращается к первой опции в списке. Я бы предпочел эту опцию, потому что использование второго решения создало бы ошибку дублирования привязки datasource, поскольку я уже привязываюсь от кода. – Tairoc

+0

У вас должен быть другой мешающий код. Можете ли вы опубликовать весь код? – Crowcoder

+0

уверен. Я приложил это выше, но долго. Большое спасибо – Tairoc

Смежные вопросы