使用显示的Gridview列名填充下拉列表

时间:2013-12-23 15:23:46

标签: c# asp.net gridview drop-down-menu

我有一种情况,我需要在DropDownList中显示GridView的列名,然后当用户选择下拉列表中的列名时,确定该列是数字还是字符串值。有没有人知道我会怎么做?我甚至不确定从哪里开始。

如果它有帮助,这是我的GridView和DataSource的代码。

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:GridView ID="GridView1" runat="server"  DataKeyNames="intBatchID" 
            AllowPaging="True" OnDataBound="GridView1_DataBound" OnRowDataBound="GridView1_RowDataBound"
            AllowSorting="True" AutoGenerateColumns="False" SkinID="NOCTS" 
            BorderStyle="Solid" HeaderStyle-BackColor="#990033" Width="1000px" 
            DataSourceID="EntityDataSource1">
            <HeaderStyle ForeColor="White"></HeaderStyle>
            <Columns>
                <asp:HyperLinkField DataNavigateUrlFields="intBatchID" HeaderText="Batch ID" DataNavigateUrlFormatString="TestPage1.aspx?intBatchID={0}" DataTextField="intBatchID" />
                <asp:BoundField DataField="vcharName" HeaderText="Name" ReadOnly="True" 
                    SortExpression="vcharName" />
                <asp:BoundField DataField="dtmScheduled" HeaderText="Date Scheduled" 
                    ReadOnly="True" SortExpression="dtmScheduled" />
                <asp:BoundField DataField="intBatchPriorityLevel" 
                    HeaderText="Priority Level" ReadOnly="True" 
                    SortExpression="intBatchPriorityLevel" />
            </Columns>
            <PagerSettings Mode="NumericFirstLast" Position="TopAndBottom" PageButtonCount="4" PreviousPageText="Previous" NextPageText="Next" FirstPageText="First" LastPageText="Last" />
            <PagerStyle HorizontalAlign="Center" />
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

<asp:EntityDataSource ID="EntityDataSource1" runat="server" 
    ConnectionString="name=TestEntities" DefaultContainerName="TestEntities" 
    EnableFlattening="False" EntitySetName="tbl_Batch"
    Select="it.[intBatchID], it.[vcharName], it.[dtmScheduled], it.[intBatchPriorityLevel]"
    OrderBy="it.[intBatchID]">   
</asp:EntityDataSource>

2 个答案:

答案 0 :(得分:1)

如果您已经知道列名称及其数据类型,则可以将它们存储在隐藏字段中,并使用它们填充下拉列表。

或者在服务器端列出一个列表。具有名称和类型属性的对象列表。获取所有名称并将其设置为下拉列表的数据源。在OnSelectedIndexChanged事件中,转到列表(它可以存储在会话视图状态或隐藏字段中)并找到相应的数据类型。

public class ColumnDetail 
{
    public string Name { get; set;}
    public string Type { get; set; }
}

创建列表

List<ColumnDetail> columnDetails = new List<ColumnDetail>();

将您的详细信息添加到此列表中。在viewstate中保存此列表。

ColumnDetailsDropdown.datasource = columnDetail.Select(cd => cd.Name).ToList();

    ColumnDetailsDropdown_OnSelectedIndexChanged(object sender, EventArgs args)
{
    string type = columnDetails.where(cd => cd.Name ==( (Dropdown) sender).SelectedValue).FirstOrDefault();

}

答案 1 :(得分:1)

首先,如果只是一次性事情,那么只需硬编码该下拉列表即可。

或者你也可以这样:

添加引用:

  using System.Collections.Generic;
  using System.Linq;
  using System.Data;

这是简短的片段:

        var gvColumns = GridView1.Columns;
        var viewName = ((IDataSource)EntityDataSource1).GetViewNames().OfType<string>().First();

        var view = (EntityDataSourceView)((IDataSource)EntityDataSource1).GetView(viewName);
        var schema = view.GetViewSchema();
        var dsColumns = schema.Columns;
        var dvColumnsDict = gvColumns.OfType<BoundField>().ToDictionary(a => a.DataField);

        // ddlNames  is your ddl
        foreach (DataColumn c in dsColumns)
        {
            if (dvColumnsDict.ContainsKey(c.ColumnName))
            {
                var li = new ListItem(string.Format("{0}: {1}", c.ColumnName, c.DataType), c.ColumnName);
                ddlColumns.Items.Add(li);
            }
        }