【问题标题】:Best list to use when ordering订购时使用的最佳清单
【发布时间】:2012-07-16 23:47:13
【问题描述】:

我在这里扩展我的问题Dynamically Creating GridView 并按照建议尝试不同的方法,但我又卡住了。

我有一个表来处理我的姓名和键值的顺序。

KeyNames:
ID Int primary key
KeyName1 varchar(20)
KeyOrder int
KeyName2 varchar(20)
KeyOrder int
...
KeyNameN varchar(20)
KeyOrder int

这些键代表要在网格视图中显示的另一个表的名称和顺序。即:

 DocumentTable:
 ID int primary key
 PDF_Folder varchar(30)
 Key1value varchar(100)
 Key2value varchar(100)
 ..
 KeyNvalue varchar(100)

因此,在我的网格视图中,用户可以决定键的列名和值(我可能想将 Key1 称为“描述”顺序 1,将 Key2 称为“提及的名称”和顺序 2。

如果 Order

我坚持如何创建一个网格视图来显示 KeyNValue 的每一列,其中列名 KeyNameN 和 KeyOrderN 的顺序..

【问题讨论】:

  • 键名和文档表是如何连接的?
  • 文档表有 Key1Value.. 到 Key20Value.. 这些是用户可以放置他们喜欢的任何值的值(他们在 key1value 中放置描述)。在 KeyNames 中,他们可以将该列命名为“Description”并将其排序为 1。因此 KeyNames 决定了在 gridview 中显示哪些列,以及列的名称。值存储在 KeyNValue..
  • 作为副作用,我建议您更改此逻辑if Order < 0 then it will not be displayed 此逻辑当然可以,但您将 order 概念display 概念混合在一起 显然它们是两个不同的东西。始终支持可读性和可维护性,如果您的实体中有一个名为EnabledVisible 的属性会更好。尊重单一职责原则,您的代码将变得易于阅读、编写和维护

标签: c# asp.net sql sql-server


【解决方案1】:

您将使用 DataGridViewColumn 的 DisplayIndex 属性来设置 Order。 您将使用 HeaderText 属性来设置名称。 我看到你没有行,所以网格将只有一行有很多列。

所以,假设您有一个名为 MyGrid 的网格,每一列都在一个名为 MyEntityRecord 的类中,您已将所有列放在一个列表中,并且您希望在用户单击按钮后显示数据,这里是一个示例代码从点击事件中调用。

void ShowCustomGrid(List<MyEntityRecord> aList)
{
    MyGrid.Columns.Clear();
    MyGrid.Rows.Clear();
    for(int loop=0;loop<aList.Count;loop++)
    {
        MyGrid.Columns.Add(new DataGridViewColumn(new DataGridViewTextBoxCell()));
        MyGrid.Columns[loop].Text=aList[loop].KeyName;
        if(aList[loop].KeyOrder<0) MyGrid.Columns[loop].Visible=false;
    }
    //Now that all columns have been added, change the display index
    for(int loop=0;loop<aList.Count;loop++)
    {
         if(aList[loop].KeyOrder>=0) MyGrid.Columns[loop].DisplayIndex=aList[loop].KeyOrder;
    }
    //Finally, put the values
    MyGrid.Rows.Add();
    for(int loop=0;loop<aList.Count;loop++)
    {
        if(aList[loop].KeyOrder>=0) MyGrid.Rows[0].Cells[loop].Value=aList[loop].KeyValue;
    }
}

如果我理解正确,这应该是你想要的。

【讨论】:

  • 我稍微改变了这种安静,但它让我朝着正确的方向前进。谢谢!
【解决方案2】:

craete 表脚本:
创建表 [dbo].[KeyNames](
[ID] [int] 非空,
[KeyName] [varchar](50) 非空,
[keyOrder] [int] 非空
) 在 [主要]


创建表 [dbo].[DocumentTable](
[ID] [int] 非空,
[PDF_Folder] [varchar](50) NOT NULL,
[Key1Value] [varchar](100) 非空,
[Key2Value] [varchar](100) 非空,
[Key3Value] [varchar](100) 非空
) 在 [主要]

==============键名表:行========
1 PDF_文件夹 2
2 Key1Value 3
3 Key3Value 5
4 Key2Value 4
5 ID 1
===========================================

==============文档表:行========
1 aa a1 a2 a3
2 bbb b1 b2 b3
3 ccc c1 c2 c3
===========================================


如下查询是生成动态订单查询:

声明 @str_column VARCHAR(100);
声明 @query VARCHAR(100);
SELECT @str_column = COALESCE(@str_column + ', ', '') + KeyName
FROM Keynames 按 keyorder 排序;
set @query= 'select ' + @str_column + ' 从 DocumentTable';
执行(@query);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多