我有一种情况,我需要在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>
答案 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)
首先,如果只是一次性事情,那么只需硬编码该下拉列表即可。
或者你也可以这样:
GridView.Columns Property - 会为您提供可以在某些条件下过滤的列集合,在您的情况下,我希望通过BoundField过滤它们
您可以使用EntityDataSourceView.GetViewSchema Method获取DataTable
使用GridView中的列,您可以在DataTable中找到列并找到它们的类型
添加引用:
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);
}
}