【问题标题】:How to get a DataGridView with vertical Columns如何获取具有垂直列的 DataGridView
【发布时间】:2014-01-23 22:49:59
【问题描述】:

在我的WinformC# 应用程序中,我有一个DataGridView,它与DataTable 绑定并且有很多记录。 我想以以下格式显示所选行(DataGridView)的详细信息(见图)。我应该使用什么Control 或(技巧)来实现这一点。

换句话说:“表格的第一列应该有列名,第二列应该有对应的值”

【问题讨论】:

  • ListView 可能最适合这个。
  • @IgbyLargeman-Ok。将尝试使用列表视图
  • 您可以尝试使用 SQL Pivot 从查询级别生成这种结果

标签: c# winforms datagridview


【解决方案1】:

通常,我不会在 DataGridView 中执行此操作,它的真正目的是显示多条记录,而您一次只想显示一条记录。我可以建议两种替代方法来处理这个问题:

如果您提前知道要显示的字段,典型的方法是在设计时布置一组单独的值显示标签和其他简单控件。这具有以下优点:

  • 事物的位置更灵活
  • 可以自定义用于每个单独字段的控件类型。例如,布尔值可能会显示一个复选框,而不是文本。
  • 值前面的标签可以本地化为用户语言。即使不是国际应用程序,显示与列的数据库架构名称不同的标签有时也很有用。

如果您不知道要在设计时显示的字段,或者不想费心布置它们,请使用 PropertyGrid 控件而不是 DataGridView。我从来没有真正尝试过将 DataTable 用作数据源,但看起来在C#/winforms: how to best bind a propertygrid and a System.Data.DataRow

上有一个很好的答案

【讨论】:

    【解决方案2】:

    我希望您尝试在 sql 中使用 PIVOT 来使您的数据集看起来像上面的结果。取而代之的是,您可以在 DataSet 中旋转(切换行和列)并将该数据集绑定到您的网格。 请看下面的链接,它会帮助你..

    http://codemaverick.blogspot.com/2008/02/transpose-datagrid-or-gridview-by.html

    【讨论】:

      【解决方案3】:

      这就是我要实现的目标

      1. 一旦构建了主 DataGridView 并绑定了数据,遍历网格上的 Columns 集合并将可见列的名称存储在 List 中(仅执行一次)
      2. 创建另一个基于 DataGridView 的简单控件(仅执行一次)
      3. 创建一个SelectionChanged事件处理函数并获取选中行的索引,如果使用单行选择模式,可以通过dg.SelectedRows[0].Index获取。
      4. 创建一个包含两列的数据表,一个字段和另一个值。遍历步骤 1 中构建的所需列列表,并在字段中添加列名称,并通过使用步骤 3 中获得的索引从绑定到主 DataGridView 的主数据表中检索 DataRow 来填充值。
      5. 清除第2步创建的控件,将其绑定到第4步创建的数据表并显示。

      【讨论】:

        【解决方案4】:

        Visual Basic Power Packs 有一个DataRepeater 控件,可以在这些情况下使用。您可以按照您想要的方式设计每一行,并为每一行放置您想要放置的任何控件。

        这是一个演示如何使用此 DataRepeater 控件的视频:

        http://channel9.msdn.com/Blogs/funkyonex/The-New-DataRepeater-Control-in-the-Latest-Power-Packs-Release

        您可以下载 Visual Basic 电源包:

        http://www.microsoft.com/en-in/download/details.aspx?id=25169

        此外,如果您使用的是 Visual Studio 2013,请阅读以下内容:

        http://ntcoder.com/bab/2013/12/20/visualbasic-powerpack-missing-from-visual-studio-2013/

        【讨论】:

          【解决方案5】:
          <asp:Repeater id="Repeater1" runat="server">
          <ItemTemplate>
              <tr>
                  <td>Reg_no</td>
                  <td>
                      <asp:Label runat="server" ID="lblreg_no" Text='<%# Eval("reg_no") %>' />
                  </td>
              </tr>
              <tr>
                  <td>Name</td>
                  <td>
                      <asp:Label runat="server" ID="lblname" Text='<%# Eval("name") %>' />
                  </td>
              </tr>
              <tr>
                  <td>DOB</td>
                  <td>
                      <asp:Label runat="server" ID="lbldob" Text='<%# Eval("dob") %>' />
                  </td>
              </tr>
          </ItemTemplate>
          </asp:Repeater>
          

          然后在你的代码后面,你就像绑定另一个容器一样。

          Repeater1.datasource= "";
          Repeater1.DataBind();
          

          【讨论】:

            猜你喜欢
            • 2014-10-01
            • 2023-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-07
            • 1970-01-01
            • 2011-10-16
            • 2019-06-04
            相关资源
            最近更新 更多