【问题标题】:Amending Gridview according to table properties根据表格属性修改Gridview
【发布时间】:2010-07-09 12:03:33
【问题描述】:

我将尝试解释这个场景。

我有一个网格视图,我希望根据用户可能设置的偏好进行修改。这些首选项存储在 EDMX (tblPref) 的表中。该表给出了首选项,即产品,首选项的别名,即 SKU,以及是否应显示首选项,即 ShowProduct?

例如,“标准网格”如下所示:

Product  UUF1   UUF2
1        a        d
2        b        e
3        c        f

tblPreference 如下所示:

Preference Alias   ShowPreference
Product    Product     1
UUF1       UUF1        1
UUF2       UUF2        1

但是,用户可能希望看到不同的列,即

Product     UUF2
    1        d
    2        e
    3        f

tblPreference 如下所示:

Preference Alias   ShowPreference
Product    Product     1
UUF1       UUF1        0
UUF2       UUF2        1

和/或他们希望用不同的文本标记标题,即

   SKU    Category Sub-Category
    1        a        d
    2        b        e
    3        c        f

tblPreference 如下所示:

Preference Alias   ShowPreference
Product    SKU             1
UUF1       Category        1
UUF2       Sub-Category    1

现在,我意识到可以隐藏列 (gridview.columns[0].Visbile = False),并且我可以修改标题文本 (gridview.HeaderRow.Cells[0].Text = "Sku") .

我不确定我是如何实现它的...重要的部分!

显然会涉及到相当多的“如果”,但我想知道是否有人以前做过类似的事情并且可以提供一些伪代码?

我走这条路的原因是我可能有数百名用户可能希望 gridview 看起来与他们完全不同。作为一个新手,尝试比“拖放”更困难的事情对我来说也有好处。

因此,我们将不胜感激地接受任何帮助。

【问题讨论】:

    标签: c# asp.net entity-framework gridview if-statement


    【解决方案1】:

    如果您在 aspx 文件中设置了这样的网格。

    <asp:GridView runat=server ID=grid1 AutoGenerateColumns=false></asp:GridView>
    

    那么您应该能够使用下面的代码来动态创建网格中需要的字段。

    using (SqlConnection conn = new SqlConnection("MySqlConnectionString"))
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand("select * from tblPreference"); // you will also have to limit this selection to only rows for this user.
        cmd.Connection = conn;
        using (SqlDataReader dr = cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                if(dr.GetInt32(dr.GetOrdinal("ShowPreference"))==1) //not sure if this is a bit or int field
                {
                    grid1.Columns.Add(new BoundField(){ 
                        HeaderText = dr.GetString(dr.GetOrdinal("Alias")),
                        DataField = dr.GetString(dr.GetOrdinal("Preference"))
                    });
                }
    
            }
        }
    }
    

    虽然我确信这必须针对您的特定用途进行一些调整。它应该给你一个好的开始。请注意,在运行上述设置列之后,您仍然需要使用 DataSource 控件或通过手动绑定它来为网格提供数据,如下所示

    grid1.DataSource = MyDataReader; //or data table, or collection of objects
    grid1.DataBind();
    

    【讨论】:

    • 非常感谢 eoldre 的建议。我会出去玩一会,但这给了我一个很好的起点 - 非常感谢你的帮助,我欠你一品脱。
    【解决方案2】:

    您可以尝试在后面的代码中以编程方式定义列,而不是在 aspx 文件中以声明方式定义。您也许可以为 DataBound 事件添加一个处理程序,并在其中创建您的 BoundFields 并使用您需要的任何标题文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多