【问题标题】:Populating Dropdownlist With Displayed Gridview Column Names使用显示的 Gridview 列名称填充下拉列表
【发布时间】:2013-12-23 15:23:46
【问题描述】:

我有一种情况,我需要在 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>

【问题讨论】:

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


    【解决方案1】:

    首先,如果是一次性的,那么硬编码该下拉菜单会容易得多。

    或者你也可以这样:

    添加参考:

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

    这里是简短的 sn-p:

            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);
                }
            }
    

    【讨论】:

    • 我很抱歉我不像你那样有成就的程序员。显然我在这方面比你新。我的代码中有很多错误。我不太确定如何让它发挥作用。
    • dvColumns 是变量吗?我正在获取 GetViewNames() 和 GetView() ,由于它们的保护级别,它们无法访问。是因为缺少命名空间吗?
    • 如果 (dvColumnsDict.ContainsKey(c.))
    • 我想通了。感谢您的帮助。
    【解决方案2】:

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

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

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

    创建一个列表

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

    将您的详细信息添加到此列表中。将此列表保存在视图状态中。

    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();
    
    }
    

    【讨论】:

    • 更新了我的答案。不能说得更详细。我正在使用我的手机。
    • 如何连接GridView获取列名?
    • gridview 中的列是动态的吗?
    • 一旦从 EntityDataSource 填充它们就不会改变。
    • 列名是您的标题文本,它不依赖于 EntitySource。如果您已经知道列的类型,您可以直接将它们添加到列表中,而无需连接到 GridView。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多