none
datagrid添加行 RRS feed

  • 问题

  • 1:datagrid未绑定数据源,但要在在运行时Load事件里添加多行,用什么样的方法?就是类似datagridview DataGridView1.Rows.Add(Lines)   一样的方法;

    2:怎么样将变量的值赋给单元格?前提也是不绑定数据源!

    2012年6月11日 12:51

答案

全部回复

  • 1)首先拖拽一个DataGridView到WinForm上,然后鼠标移动到右上角出现一个小箭头,点击弹出一个框框,选择“添加列”(添加若干列)之后再适当地方调用你的方法(多次调用)!

    譬如添加了2列(Id,name)

    DataGridView1.Rows.Add(1,"Name1")
    DataGridView1.Rows.Add(2,"Name2")

    >>怎么样将变量的值赋给单元格?前提也是不绑定数据源!

    这个必须针对已经创建好的行,然后通过Rows和Cells引用:

    DataGridView.Rows(从0开始索引).Cells(从0开始索引).Value = 你的内容


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月12日 2:38
    版主
  • 您这说的是datagridview,我问的是datagrid,我试过下面这种方法,但我在程序里无论怎么想办法就是无法通过改变myclasses的值却无法更新datagrid1显示给用户的数据

    Public class MyClass
     
    Public Property Value As String
    End Class

    '绑定代码
    Dim myclasses As New List(Of MyClass)
    '添加变量
    myclasses
    .Add(New MyClass With{.Value="a"})
    …………
    '绑定
    DataGrid1
    .DataSource = myclasses

    2012年6月12日 2:58
  • >>您这说的是datagridview,我问的是datagrid

    对不起,不过我建议你如果使用.NET的话,用DataGridView比较好。

    至于dataGrid,尝试这样做:必须绑定数据源,貌似无法直接像DataGridView一样动态添加数据。要不你到可以在绑定的数据源中添加数据,然后再次绑定(使用BindingSource类,实时添加自动绑定):

    Public Class Form1
        Dim bs As BindingSource = Nothing
    
        Public Class Model
            Public Property Id As Integer
            Public Property Name As String
        End Class
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            '动态数据源
            Dim ls As New List(Of Model)
            For index = 1 To 10
                ls.Add(New Model With {.Id = index, .Name = "Name" & index})
            Next
    
            '绑定
            bs = New BindingSource(ls, "")
            DataGrid1.DataSource = bs
    
            '动态添加
            bs.Add(New Model With {.Id = 11, .Name = "Name11"})
        End Sub
    End Class

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月12日 3:10
    版主
  • Public Class Form1
       
    Dim bs As BindingSource = Nothing

       
    Public Class Model
           
    Public Property Id As Integer
           
    Public Property Name As String
       
    End Class
       
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick        '动态数据源
           
    Dim ls As New List(Of Model)
           
    For index = 1 To 10
                ls
    .Add(New Model With {.Id = index, .Name = "Name" & index})
           
    Next

           
    '绑定
            bs
    = New BindingSource(ls, "")
            DataGrid1
    .DataSource = bs

           
    '动态添加
            bs
    .Add(New Model With {.Id = 11, .Name = "Name11"})
       
    End Sub
    End Class

    我把代码改成了上面这样测试在数据显示上得到了我想要的结果,光标却无法移动,而选择某一个单元格。但是,虽然要求表格的数据是只读的,可用户需要点击光标辟如单击每二行第二例引发事件执行其它工作,我该怎么办呢?

    其实我在使用datagridview时大部分符合我的要求,因为我使用的是MDI窗体,那些显示数据的窗体都是他们的子窗体,如果只当第一次运行程序打开放置datagridview因为Load事件添加了36行,显示的时候给用户感觉是一行一行显示太慢的话,是可以用datagridview的,问题是,激活其它MDI子窗体后,再一次激活放置放置datagridview这个子窗体的时候,它仍然给出一种Load的显示感觉,而表格的外观(不包括数据)不是静止的。

    2012年6月12日 3:35
  • 我还是告诉您,用DataGridView而不是DataGrid,因为.NET已经“抛弃”dataGrid了。

    此外,我怀疑你是不是多个子窗体共享同一个数据源?还是说——一个窗体中数据源发生变化,其余也跟着变化?


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月12日 4:36
    版主
  • 不是多个子窗体同享一个数据源,我的数据源其实就是一些个固定长度字符串变量,并将其读入固定长度字符串数组,而这些符串数据是通过串口循环读取PLC(可编程控制器)的值,因为设备在运行,那些因定长度的字符串变量的值随时都在改变,编程的目的就是通过表格的方式实时显示这些字符串数组,就是这样需要实时更新,所以用到了Timer

    MDI是将不同的数据显示在不同的子窗体,尽管有不同的子窗体共享全局变量,但这并不影响放置datagrid这个窗体的显示以及不会以任何方式改变这些数据,纵使共享某些变量,也绝不会去改变那些变量的值,那些字符串变量只由串口读数据而刷新



    2012年6月12日 5:41
  • 不是多个子窗体同享一个数据源,我的数据源其实就是一些个因定长度字符串变量,并将其读入固定长度字符串数组,而这些符串数据是通过串口循环读取PLC(可编程控制器)的值,因为设备在运行,那些因定长度的字符串变量的值随时都在改变,编程的目的就是通过表格的方式实时显示这些字符串数组,就是这样需要实时更新,所以用到了Timer

    PLC编程的话我建议你使用嵌入式开发,至少我不认为使用VB.NET或者VB可以开发实时高精度的东西……:-)

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月12日 5:43
    版主
  • 嵌入式开发是什么?恕我懂的实在太少,PLC供应商好象没有提供那些开发包,大家都是用VB或是用VC吧,至少我们这个行业是

    目前来说使用VB还是能达到要求的,而且99年左右用VB6.0开发的这一套电镀生产线的程序很多大型客户到如今都在使用,而且现在帮人做生产线我还是不得不使用原来用VB6写的监控程序,因为VB.net改变太大,在时间上没有跟得上来,所以遇到了这些困难



    2012年6月12日 5:55
  • 是的,那建议你最好用VB6;VB.NET被微软封装了很多次,很多东西和原先完全不同;VB.NET也不是适合开发工控程序的。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月12日 5:57
    版主
  • 可是vb6已经不支持Win7了
    2012年6月12日 6:16
  • 2012年6月12日 6:28
    版主
  • 这个datagrid是属于.net
    2012年6月12日 7:23
  • 这个datagrid是属于.net
    呵呵,当然……因为你一定要用……。我所以不建议……

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月12日 7:34
    版主
  • 如果datagrid1行列创建以后,不需要改变这个表格的结构的前提下,如果能够用代码修改单元格的值,当然不重新绑定数据源也许问题可以解决
    2012年6月21日 16:31
  • 如果datagrid1行列创建以后,不需要改变这个表格的结构的前提下,如果能够用代码修改单元格的值,当然不重新绑定数据源也许问题可以解决

    不过就我所知,貌似你不绑定数据源dataGrid无法显示数据的,何来修改单元格数据呢?

    要修改单元格数据:dataGrid.Items(行索引,列索引)=内容


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月21日 23:53
    版主
  • 是想在窗体Load的时候绑定list数据源用以创建行和列,并且每一次显示变量的值到表格,加载以后,因为表格内的各种数据的值会发生变化,希望可以通过您说的dataGrid.Items(行索引,列索引)=内容,这种方式来刷新表格的值,如果datagrid确实做不到,那我也谢谢您了,然后我会标记答案的。关于datagrid.Items(行索引,列索引)=内容,我先测试一下
    2012年6月22日 5:49
  • 你好,

    DataGrid作为DataGridView的前身,现在已经很少在VB.NET中使用了,当然你可以使用它,但是如你所见,功能远不如DataGridView强大。我同意编程志愿者的意见,请将数据填充到dataTable中,然后绑定到DataGrid,在操作DataGrid的时候,操作DataTable即可。

    我将暂时关闭这个主题,如果你需要进一步的协助,请在这里回复即可。

    Best regards,


    Shanks Zen
    MSDN Community Support | Feedback to us

    2012年7月4日 3:17
    版主