【问题标题】:VB.net - Programmatically change column type of data bounded DatagridviewVB.net - 以编程方式更改数据有界 Datagridview 的列类型
【发布时间】:2017-10-01 05:15:15
【问题描述】:

有没有办法改变数据库边界数据网格视图的列类型?

到目前为止我有这个代码:

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) 

以及当前的输出:

我只想让主题标题列成为一个组合框,而不仅仅是一个文本字段。有什么办法吗?

【问题讨论】:

  • 好吧,试试这个:从你的查询中避免Subject Title,填充DataGridView,填充后,创建组合框Dim cbo as DataGridViewComboBoxColumn,添加项目cbo.Items.Add("some value"): and again, again...并输入DataGridViewComboBoxColumn使用代码dgvClassDist.Columns.Insert(1, cbo)...进入DataGridView1 表示放置组合框列的位置...顺便说一句。有链接类似问题:stackoverflow.com/questions/18677772/…
  • 您不会更改列的类型。就是这样。您应该在将数据绑定到网格之前创建所需类型的列。您设置网格列的DataPropertyName 来告诉它要绑定到哪个表列,然后您将不会自动创建列。看看这个:vbforums.com/…

标签: vb.net winforms datagridview


【解决方案1】:

如果您使用数据网格并让它为您自动生成列,那么您可以更改数据网格中 .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. 不要重命名查询中的列 - 保留 HeaderText 数据网格的属性为您执行此操作。
  2. 不必费心设置日期等查询字段的格式 - 让数据网格也可以使用 DataFormatString 属性为您执行此操作。

我不能 100% 确定您想要这些下拉列表的确切时间以及您希望用户如何更改它们,所以我将它们放在编辑模板中 - 您需要在数据网格中有一个编辑按钮让网格切换到编辑模式并编写更多代码来处理编辑。如果您总是想要一个下拉列表,那么您可以将 DDL 放在 ItemTemplate 中,并在 ItemType 是 Item 或 Alternating item 时将其填充到 ItemDataBound 事件中。

【讨论】:

  • 这是关于 winforms,而不是 webforms
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2017-04-27
  • 2012-11-12
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多