【问题标题】:How do I use a DataGridView in .NET 3.5?如何在 .NET 3.5 中使用 DataGridView?
【发布时间】:2009-06-02 13:11:17
【问题描述】:

我正在尝试构建一个如下所示的员工数据输入表单:

员工表格 ----------------------------------------------------------- --------------------------------------- | | |姓名 | | | |图片 |部门 | | | | |职位 | | | | |出生日期 | | | --------------------------------------- | ... 重复每位员工 | ... | --------------------------------------- | | |姓名 | | | |图片 |部门 | | | | |职位 | | | | |出生日期 | | | --------------------------------------- | -----------------------------------------------------------

使用 Microsoft Access 构建它非常容易,但是如何使用 Winforms + C# + .NET 3.5 构建它?
我尝试使用DataGridView,但无法让它看起来像我上面的示例。

【问题讨论】:

  • 悲哀至极。我现在不能回答你的问题,但我已经创建了你所说的使用 VB.net 的内容,它不应该有那么不同。当我回到我的笔记本电脑时,我会在这里粘贴我的代码并尝试发布一张它看起来曾经运行过的图片。我唯一不确定的是我认为我可能使用了 listView 而不是 DataGridView。

标签: c# winforms .net-3.5 datagridview


【解决方案1】:

好的。我终于带着笔记本电脑回家了。因此,我所做的与您想做的相同的事情是我使用了一个 ListView,它是我从数据表中动态填写的。这是代码(我正在做的总结是在代码之后的底部):

 For i = 0 To frmSelection.MechDataTable2.Rows.Count - 1
            Dim tmpGroup As ListViewGroup = New ListViewGroup(frmSelection.MechDataTable2.Rows(i).Item("MechName"))
            ltvMechs.Groups.Add(tmpGroup)
            Dim tmpListItem1 As ListViewItem = New ListViewItem(tmpGroup)
            Dim tmpListItem2 As ListViewItem = New ListViewItem(tmpGroup)
            Dim tmpListItem3 As ListViewItem = New ListViewItem(tmpGroup)
            Dim tmpListItem4 As ListViewItem = New ListViewItem(tmpGroup)
            Dim tmpListItem5 As ListViewItem = New ListViewItem(tmpGroup)

            'row1
            tmpListItem1.SubItems.Add("co1")
            tmpListItem1.SubItems.Add("co2")
            tmpListItem1.SubItems.Add("co3")
            tmpListItem1.SubItems.Add("co4")
            tmpListItem1.SubItems.Add("co5")
            tmpListItem1.SubItems.Add("co6")
            tmpListItem1.SubItems.Add("co7")

            tmpListItem1.SubItems(0).Text = "Select"
            tmpListItem1.SubItems(1).Text = frmSelection.MechDataTable2.Rows(i).Item("Price")
            tmpListItem1.SubItems(2).Text = frmSelection.MechDataTable2.Rows(i).Item("MechID")
            tmpListItem1.SubItems(3).Text = "Faction Orientation"
            tmpListItem1.SubItems(4).Text = frmSelection.MechDataTable2.Rows(i).Item("FactionOrientation")
            tmpListItem1.SubItems(5).Text = "Engine HDP"
            tmpListItem1.SubItems(6).Text = frmSelection.MechDataTable2.Rows(i).Item("EngineHardPoint")


            'row2
            tmpListItem2.SubItems.Add("co1")
            tmpListItem2.SubItems.Add("co2")
            tmpListItem2.SubItems.Add("co3")
            tmpListItem2.SubItems.Add("co4")
            tmpListItem2.SubItems.Add("co5")
            tmpListItem2.SubItems.Add("co6")
            tmpListItem2.SubItems.Add("co7")

            tmpListItem2.SubItems(0).Text = ""
            tmpListItem2.SubItems(1).Text = ""
            tmpListItem2.SubItems(2).Text = ""
            tmpListItem2.SubItems(3).Text = "Required Rep"
            tmpListItem2.SubItems(4).Text = frmSelection.MechDataTable2.Rows(i).Item("RequiredRep")
            tmpListItem2.SubItems(5).Text = "Generator HDP"
            tmpListItem2.SubItems(6).Text = frmSelection.MechDataTable2.Rows(i).Item("GeneratorHardPoint")


            'row3
            tmpListItem3.SubItems.Add("co1")
            tmpListItem3.SubItems.Add("co2")
            tmpListItem3.SubItems.Add("co3")
            tmpListItem3.SubItems.Add("co4")
            tmpListItem3.SubItems.Add("co5")
            tmpListItem3.SubItems.Add("co6")
            tmpListItem3.SubItems.Add("co7")

            tmpListItem3.SubItems(0).Text = ""
            tmpListItem3.SubItems(1).Text = ""
            tmpListItem3.SubItems(2).Text = ""
            tmpListItem3.SubItems(3).Text = "Resilience"
            tmpListItem3.SubItems(4).Text = frmSelection.MechDataTable2.Rows(i).Item("Resilience")
            tmpListItem3.SubItems(5).Text = "Heavy HDP"
            tmpListItem3.SubItems(6).Text = frmSelection.MechDataTable2.Rows(i).Item("HeavyHardPoint")


            'row4
            tmpListItem4.SubItems.Add("co1")
            tmpListItem4.SubItems.Add("co2")
            tmpListItem4.SubItems.Add("co3")
            tmpListItem4.SubItems.Add("co4")
            tmpListItem4.SubItems.Add("co5")
            tmpListItem4.SubItems.Add("co6")
            tmpListItem4.SubItems.Add("co7")

            tmpListItem4.SubItems(0).Text = ""
            tmpListItem4.SubItems(1).Text = ""
            tmpListItem4.SubItems(2).Text = ""
            tmpListItem4.SubItems(3).Text = "Weight"
            tmpListItem4.SubItems(4).Text = frmSelection.MechDataTable2.Rows(i).Item("Weight")
            tmpListItem4.SubItems(5).Text = "Medium HDP"
            tmpListItem4.SubItems(6).Text = frmSelection.MechDataTable2.Rows(i).Item("MediumHardPoint")


            'row5
            tmpListItem5.SubItems.Add("co1")
            tmpListItem5.SubItems.Add("co2")
            tmpListItem5.SubItems.Add("co3")
            tmpListItem5.SubItems.Add("co4")
            tmpListItem5.SubItems.Add("co5")
            tmpListItem5.SubItems.Add("co6")
            tmpListItem5.SubItems.Add("co7")

            tmpListItem5.SubItems(0).Text = ""
            tmpListItem5.SubItems(1).Text = ""
            tmpListItem5.SubItems(2).Text = ""
            tmpListItem5.SubItems(3).Text = "Structure"
            tmpListItem5.SubItems(4).Text = frmSelection.MechDataTable2.Rows(i).Item("Class")
            tmpListItem5.SubItems(5).Text = "Light HDP"
            tmpListItem5.SubItems(6).Text = frmSelection.MechDataTable2.Rows(i).Item("LightHardPoint")


            ltvMechs.Items.Add(tmpListItem1)
            ltvMechs.Items.Add(tmpListItem2)
            ltvMechs.Items.Add(tmpListItem3)
            ltvMechs.Items.Add(tmpListItem4)
            ltvMechs.Items.Add(tmpListItem5)
        Next

基本上,每个列表项是组中的一行,每个子项是行中的一个单元格(类似于您在 excel 中看到的,访问等。) subitem(0) 在 col1 中,subitem(1) 在在col2等。对于您的第一列,您将 listItem1 的 subitem(0) 作为图片,而您希望将所有其他 subitem(0) 设为空白。正如我在上面所说的那样,我在 vb.net 中对此进行了编码,但据我所知,它与 C# 并没有太大不同。这里还有一张这段代码产生的部分图片。对质量感到抱歉,但这是我能做的最好的事情。 alt text http://img268.imageshack.us/img268/7977/listviewexample.png

【讨论】:

    【解决方案2】:

    尝试构建一个自定义控件,其中包含单个员工的所有数据,然后将该控件的多个实例添加到 FlowLayoutPanel 或类似的东西。您的自定义控件可能很简单,只需一个包含图片框和一些文本框的拆分面板。

    【讨论】:

      【解决方案3】:

      首先,获取BindingListView。然后,您可以将 Lists 绑定到 DataGridViews,而不是使用 DataTables/Sets。然后,您可以将第二列的 DataPropertyName 设置为“详细信息”属性,如下所示:

      public string Details 
      { 
          get 
          { 
              return string.Format("{0}\n{1}\n{2}\n{3}", Name, Department, Position, DOB); 
          } 
      } 
      

      【讨论】:

        【解决方案4】:

        为什么不尝试像这样将数据绑定到中继器?

        <asp:Repeater ID="Repeater1" runat="server">
            <HeaderTemplate>
                <table>
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td rowspan="4">
                        <%# Eval("Picture") %>
                    </td>
                    <td>
                        <%# Eval("Name") %>
                    </td>
                </tr>
                <tr>
                    <td>
                        <%# Eval("Department") %>
                    </td>
                </tr>
                <tr>
                    <td>
                        <%# Eval("Position") %>
                    </td>
                </tr>
                <tr>
                    <td>
                        <%# Eval("DOB") %>
                    </td>
                </tr>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
            </table></FooterTemplate>
        </asp:Repeater>
        

        【讨论】:

        • 非常适合 WebForms。对 WinForms 没那么有用。
        • 谢谢,我正在使用 DataRepeater 附带的 Microsoft Visual Basic Power Packs 3.0。我被如何枚举转发器内的元素所困扰。为什么 Microsoft 不能提供对 DataRepeater 子项的轻松访问?
        猜你喜欢
        • 1970-01-01
        • 2012-03-11
        • 2018-10-03
        • 2019-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多