簡體   English   中英

VB.net-以編程方式更改數據綁定Datagridview的列類型

[英]VB.net - Programmatically change column type of data bounded Datagridview

有沒有一種方法來更改數據庫綁定的datagridview的列類型?

到目前為止,我有以下代碼:

Dim query As String = "SELECT a.class_code as 'Class Code', a.sub_code as 'Subject Title', Gr_Lvl as 'Grade Level', sub_session as 'Session', TIME_FORMAT(start_time, '%h:%i%p') as 'Start Time', TIME_FORMAT(end_time, '%h:%i%p') as 'End Time', sub_day as 'Day', class_room as 'Room', sub_units as 'Units', teacher_name as 'Teacher', sub_remarks as 'Remarks', subloading_no " & _
    "FROM tbl_subloading a INNER JOIN tbl_class b on a.class_code=b.class_code INNER JOIN tbl_subject c on a.sub_code=c.sub_code  WHERE  a.class_code='" & txtClassCode.Text & "' AND sub_semester = '" & UserDataRead1("SELECT semester_desc From tbl_semester where status= 'active'") & "' ORDER BY start_time ASC"
    FillDBGrid(query, dgvClassDist) 

和當前輸出:

在此處輸入圖片說明

我只希望“主題標題”列是一個組合框,而不僅僅是文本字段。 有什么辦法嗎?

如果您正在使用數據網格並讓其自動為您生成列,則可以在數據網格內的.aspx / .ascx頁中更改列定義。 代替使用asp:BoundColumn,而使用asp:TemplateColumn。 例如:

            <asp:DataGrid ID="dgMyData" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundColumn DataField="class_code" HeaderText="Class Code" />
                <asp:BoundColumn DataField="sub_code" HeaderText="Subject Title" />
                <asp:TemplateColumn>
                    <ItemTemplate>
                        <%#Eval("sub_code")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="ddlSubjects" runat="server" />
                    </EditItemTemplate>
                </asp:TemplateColumn>
                <asp:BoundColumn DataField="Gr_Lvl" HeaderText="Grade Level" />
                <asp:BoundColumn DataField="sub_session" HeaderText="Session" />
                <asp:BoundColumn DataField="start_time" HeaderText="Start Time" DataFormatString="{0:hh:mm tt}" />
                <asp:BoundColumn DataField="end_time" HeaderText="End Time" DataFormatString="{0:hh:mm tt}" />
                <asp:BoundColumn DataField="sub_day" HeaderText="Day" />
                <asp:BoundColumn DataField="class_room" HeaderText="Room" />
                <asp:BoundColumn DataField="sub_units" HeaderText="Units" />
                <asp:BoundColumn DataField="teacher_name" HeaderText="Teacher" />
                <asp:BoundColumn DataField="sub_remarks" HeaderText="Remarks" />
                <asp:BoundColumn DataField="subloading_no" HeaderText="???" />
            </Columns>
        </asp:DataGrid>

然后,您可以將代碼放在后面以在適當的時候填寫下拉列表。

Imports System.Collections.Generic

Public Class DataGridTest
Inherits System.Web.UI.Page

Private Class Subject
    Public Property Code As String
    Public Property Name As String
End Class

Private SubjectList As List(Of Subject)

Private Function GetSubjects() As List(Of Subject)
    'TODO - write some code to get the subjects - below is just an example
    Return New List(Of Subject) From {New Subject With {.Code = "HIST 100", .Name = "US History"},
                                      New Subject With {.Code = "MATH 212", .Name = "Algerbra II"},
                                      New Subject With {.Code = "SCI B200", .Name = "Adv. Biology"}}
End Function

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ' CACHE THE SUBJECTS
    SubjectList = GetSubjects()
    ' Get the class data but don't bother making the names pretty - let the datagrid do that
    Dim qry = "Select a.class_code, a.sub_code, Gr_Lvl, ....."
    ' execute the query and bind the data to the datagrid
    Dim dgvClassDist As DataView
    dgMyData.DataSource = dgvClassDist
    dgMyData.DataBind()
End Sub

Private Sub dgMyData_ItemDataBound(sender As Object, e As DataGridItemEventArgs) Handles dgMyData.ItemDataBound
    If e.Item.ItemType = ListItemType.EditItem Then
        Dim ddl As DropDownList = e.Item.FindControl("ddlSubjects")
        ddl.Items.Clear()
        ddl.DataSource = SubjectList
        ddl.DataValueField = "Code"
        ddl.DataTextField = "Name"
        ddl.DataBind()
        Dim currentClassCode = e.Item.DataItem("class_code").ToString
        Dim item As ListItem = ddl.Items.FindByValue(currentClassCode)
        If item IsNot Nothing Then
            item.Selected = True
        End If
    End If
End Sub

末級

注意幾件事:

  1. 不要重命名查詢中的列-保留datagrid的HeaderText屬性可以為您完成此操作。
  2. 不要煩惱格式化查詢字段(例如日期),讓datagrid也使用DataFormatString屬性為您做到這一點。

我不是100%確切地確定您何時想要這些下拉列表以及您希望用戶如何更改它們,因此我將它們放在編輯模板中-您需要在數據網格中具有一個編輯按鈕才能具有網格切換到編輯模式並編寫更多代碼以處理編輯。 如果您始終需要一個下拉列表,則可以將DDL放在ItemTemplate中,並在ItemType是Item或Alternateating項目時將其填充到ItemDataBound事件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM