根据DB中的列添加数据

时间:2015-11-12 20:33:26

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

所有信息如下,但主要的想法是: 我希望能够根据事件编号显示或隐藏Repeater Control中的列。例如,事件5将显示某些列,如名称和地址,并隐藏其他列,如电话和电子邮件。我想我可以以某种方式分配1或0来记录应该使用或不使用哪些。使用Name的事件5将是51,而不是使用Phone将是50.如何实现这一点,不确定。

信息: 我正在为会议构建一个Web应用程序。将有管理员可以创建Web表单供人们注册参加会议。我希望管理员可以控制他们为注册人收集哪些字段。仅出于测试目的,他们可以收集的字段包括名字,姓氏,地址,电子邮件,电话和衬衫尺寸

Table: Registrant
Columns: Id, EventId, FirstName, LastName, Address, Email, Phone, ShirtSize

根据会议的不同,会有某些字段未使用。例如,会议1想收集ShirtSize数据,但会议2不想收集ShirtSize数据。

我在Visual Studio中使用Repeater控件,该控件当前从注册人生成所有列。

ASP

 <asp:Repeater ID="Repeater1" runat="server">
   <ItemTemplate>
        <asp:Label ID="lblTest" runat="server" Text='<%# Eval("MyColumn") %>'></asp:Label>
        <asp:TextBox ID="textTest" runat="server"></asp:TextBox>
   </ItemTemplate>
</asp:Repeater>

C#

   DataTable table = new DataTable();
        table.Columns.Add("MyColumn", typeof(string));


        using (SqlConnection sqlConn2 = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString))
        {
            sqlConn2.Open();

            using (SqlCommand sqlCmd2 = new SqlCommand())
            {
                sqlCmd2.Connection = sqlConn2;
                sqlCmd2.CommandType = System.Data.CommandType.Text;
                sqlCmd2.CommandText = string.Format("SELECT COLUMN_NAME AS MyColumn FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName");
                //sqlCmd2.CommandText = string.Format("SELECT COLUMN_NAME AS MyColumn FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName" AND SHOW = @Show);
                sqlCmd2.Parameters.Add("@TableName", SqlDbType.NVarChar).Value = "registrant";
                //sqlCmd2.Parameters.Add("@Show", SqlDbType.NVarChar).Value = "show";
                sqlCmd2.ExecuteNonQuery();
                using (SqlDataReader sqlReader = sqlCmd2.ExecuteReader())
                {
                    while (sqlReader.Read())
                    {
                        DataRow tableRow = table.NewRow();
                        tableRow["MyColumn"] = sqlReader["MyColumn"].ToString();
                        table.Rows.Add(tableRow);
                    }
                    Repeater1.DataSource = table;
                    Repeater1.DataBind();
                }

                sqlConn2.Close();
            }
        }
    }

我想要一种根据事件显示正确列的方法。例如,如果事件为5,则显示FirstName,LastName和Address。我想在我的数据库本身实现这一点,而不是通过我的C#代码,因为这将是一个大的Web应用程序完成所有。我想可能是某种类型的触发器,但我是数据库新手并不完全确定。我正在使用SQL Server Management Studio。在我的C#代码中,我注释掉了两行,一旦我找出问题的数据库结构,就可以使用它。

1 个答案:

答案 0 :(得分:0)

您可以创建一个单独的表来控制每列的​​列设置,这是一个示例表:

CREATE TABLE ColumnSettings
(
    EventId int,
    TableName nvarchar(50),
    ColumnName nvarchar(50),
    Visible bit
)

当您查询转发器控件的数据时,您还可以在此新表中查询设置:

select
ColumnName
from ColumnSettings
where EventId = @event_id
and TableName = @table_name
and Visible = 1

并使用此查询的结果来决定是否要将列添加到转发器控件的数据中