[英]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
末級
注意幾件事:
我不是100%確切地確定您何時想要這些下拉列表以及您希望用戶如何更改它們,因此我將它們放在編輯模板中-您需要在數據網格中具有一個編輯按鈕才能具有網格切換到編輯模式並編寫更多代碼以處理編輯。 如果您始終需要一個下拉列表,則可以將DDL放在ItemTemplate中,並在ItemType是Item或Alternateating項目時將其填充到ItemDataBound事件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.