2011-11-16 40 views
7

Một nửa trận chiến nhận câu trả lời là biết cách đặt câu hỏi. Tôi không chắc chắn tôi đang làm tốt công việc đó nhưng đây là bức ảnh đẹp nhất của tôi.Cách liên kết DropDownList trong Gridview với dữ liệu KHÔNG từ gridview

Tôi đang cố gắng liên kết ddl với dữ liệu bên trong chế độ xem lưới mà KHÔNG đến từ chính chế độ xem lưới. Đây là trong EditItemTemplate. Mục đích để làm như vậy là cung cấp cho người dùng, để bắt đầu, một giá trị đã chọn và một loạt các giá trị khác từ một thủ tục được lưu trữ tra cứu.

Tôi sẽ đề cập đến ở đây rằng tôi đã thực hiện thành công trước đây nhưng sử dụng ObjectDataSource. Tôi đang cố gắng để tránh điều đó thời gian này và làm điều đó hoàn toàn từ mã phía sau cho bây giờ sau đó di chuyển nó vào một lớp dữ liệu sau đó.

Dưới đây là những gì tôi có cho đến nay ...

<asp:GridView ID="usersGrid" runat="server"     
     DataKeyNames="userID" 
     AutoGenerateColumns="false" Width="580" 
     OnRowUpdating="usersGrid_RowUpdating" 
     OnRowEditing="usersGrid_RowEditing" 
     OnRowCancelingEdit="usersGrid_RowCancelingEdit"         OnRowDeleting="usersGrid_RowDeleting" 
     > 

...

<EditItemTemplate> 
       <div class="gridName"> 
        <asp:TextBox ID="txtFirstName" Text='<%#Eval("firstName") %>' runat="server" Width="95" /> 
       </div> 
       <div class="gridName"> 
        <asp:TextBox ID="txtLastName" Text='<%#Eval("lastName") %>' runat="server" Width="95" /> 
       </div> 
       <div class="gridEmail"> 
        <asp:TextBox ID="txtEmail" Text='<%#Eval("email") %>' runat="server" Width="245" /> 
       </div> 
       <div class="gridName"> 
        <asp:DropDownList ID="ddl_GetLists" 
        DataSourceID="GetListData()" 
        AppendDataBoundItems="true" 
        DataValueField="listID" 
        DataTextField="listName" 
        SelectedValue='<%#Bind("listID") %>' 
        runat="server" 
        > 
        </asp:DropDownList> 
       </div> 
      </EditItemTemplate> 

....

Protected Sub usersGrid_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs) 
    usersGrid.EditIndex = e.NewEditIndex 
    BindData() 

End Sub 

....

Private Sub BindData() 
    Dim conn As New SqlConnection(connectionString) 
    Dim ad As New SqlDataAdapter("MAINT_DIST_GET_USERS", conn) 
    Dim ds As New DataSet() 
    ad.Fill(ds) 
    GetListData() 
    usersGrid.DataSource = ds 
    usersGrid.DataBind() 

End Sub 

Tôi bao gồm cả hai lần cuối cùng cũng như các cách tiếp cận khác mà tôi đã thử và thất bại.

...

Protected Sub usersGrid_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) 
    If e.Row.RowState = DataControlRowState.Edit Then 
     Dim ddl As DropDownList = DirectCast(e.Row.FindControl("ddl_GetLists"), DropDownList) 

     Dim conn As New SqlConnection(connectionString) 
     Dim ad As New SqlDataAdapter("MAINT_DIST_GET_LISTS", conn) 
     Dim ds As New DataSet() 
     ad.Fill(ds) 

     ddl.DataSource = ds 
     ddl.DataBind() 
    End If 
End Sub 

Public Function BindDropdown() As DataSet 
    Dim conn As New SqlConnection(connectionString) 
    Dim ad As New SqlDataAdapter("MAINT_DIST_GET_LISTS", conn) 
    Dim ds As New DataSet() 
    ad.Fill(ds) 

    ddl_GetLists.DataSource = ds 
    ddl_GetLists.DataBind() 
End Function 

Tôi cũng sẽ hỏi tại sao, trong hàm chính thức, tại sao là kiểm soát, ddl_GetLists, không được coi là tốt? Bên trong lưới nó biến mất khỏi nhà thiết kế nhưng bên ngoài lưới nó lại xuất hiện.

Cảm ơn tất cả vì sự giúp đỡ của bạn.

Trả lời

11

Bạn có một vài tùy chọn. Bạn có thể sử dụng điều khiển nguồn dữ liệu hoặc bạn có thể liên kết các menu thả xuống ở mã sau trong sự kiện RowDataBound của GridView.

Tôi cũng đã nhận thấy một số vấn đề trong mã của bạn. Trong ví dụ của bạn, bạn chỉ định DataSourceID không chính xác. Các DataSourceID phải trỏ đến ID của một điều khiển nguồn dữ liệu trên trang:

<asp:DropDownList ID="ddl_GetLists"  
    DataSourceID="SqlDataSource1"  
    AppendDataBoundItems="true"  
    DataValueField="listID"  
    DataTextField="listName"  
    SelectedValue='<%#Bind("listID") %>'  
    runat="server">  
</asp:DropDownList> 

<asp:SqlDataSource ID="SqlDataSource1" runat="server"     
    ConnectionString="<%$ ConnectionStrings:ConnectionString %>"     
    SelectCommand="SELECT listID, listName FROM SomeTable">            
</asp:SqlDataSource> 

Nếu bạn muốn làm các ràng buộc trong code-behind, bạn có thể làm điều này thông qua việc RowDataBound sự kiện:

Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) 
    If e.Row.RowType = DataControlRowType.DataRow AndAlso (e.Row.RowState And DataControlRowState.Edit) = DataControlRowState.Edit Then 
     Dim ddl As DropDownList = TryCast(e.Row.FindControl("ddl_GetLists"), DropDownList) 
     If ddl IsNot Nothing Then 
      ddl.DataSource = RetrieveDataSource() 
      ddl.DataBind() 
     End If 
    End If 
End Sub 
+0

tôi đã thực hiện thành công một cái gì đó tương tự như sau sử dụng một ObjectDataSource trong quá khứ nhưng tôi đang cố gắng để làm điều này độc quyền từ mã sau thời gian này. Điều này có thể không? –

+0

Vâng, chắc chắn rồi. Hãy cho tôi một giây và tôi sẽ cập nhật câu trả lời của tôi. –

+0

Về thuộc tính ConnectionStrings. Ứng dụng tôi đã được gán để nối thêm sử dụng một khóa trong appSettings thay vì thuộc tính connectionstring bình thường từ tệp cấu hình. Có cách nào để gọi nó từ sqldatasource? –

0

Tôi thấy một vài vấn đề.

Protected Sub usersGrid_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs) 
    usersGrid.EditIndex = e.NewEditIndex 
    BindData() 

End Sub 

Tại sao bạn làm điều này? Tại sao bạn sẽ liên kết lại lưới trên một sự kiện trên lưới của bạn đã được lấp đầy?

+1

Phần thứ hai của câu trả lời của bạn là không chính xác. Không có vấn đề gì khi tìm kiếm điều khiển bằng ID đó. –

+0

Bạn chính xác. Tôi sẽ cập nhật. – Etch

+0

Tôi nên lưu ý rằng trong khi sử dụng VS 2010 điều khiển ddl, trong khi trong GridView là "không" có thể nhìn thấy "để ứng dụng nhưng khi tôi lấy nó ra khỏi lưới nó" là ". Tôi không có lời giải thích cho điều này. –

1

Bạn chỉ có thể tạo ra một danh sách toàn cầu của kiểu mà bạn muốn và đặt nó như là null nếu bạn đang sử dụng LINQ sau đó chỉ cần đặt nguồn mà trong DropDownListObject.DataSource

DropDownListObject.DataSource=ObjListSource; 
DropDownListObject.DataBind; 

Hy vọng nó sẽ rất hữu ích.

0

Bạn sửa lỗi này:

  1. Trong trang mã, bạn định nghĩa một GetListData() public function (tôi nghĩ rằng bạn đã làm).

  2. sở hữu sử dụng DataSource (nếu bạn muốn gọi một chức năng):

      <asp:DropDownList ID="ddl_GetLists" 
               DataSource='<%# GetListData() %>' 
               AppendDataBoundItems="true" 
               DataValueField="listID" 
               DataTextField="listName" 
               SelectedValue='<%#Bind("listID") %>' 
               runat="server" > 
          </asp:DropDownList> 
    
+0

Cảm ơn Bạn có thể đặt một số dấu ngắt dòng trong nội dung của bạn nếu bạn để 2 khoảng trống ở cuối dòng. Điều này làm cho câu trả lời rõ ràng hơn. –

Các vấn đề liên quan