我正在尝试将ASP.NET GridView
控件绑定到string
数组,我得到以下项目:
具有名称的字段或属性 在所选内容中找不到“项目” 数据来源。
我应该在GridView控件中使用asp:BoundField列的DataField属性的正确值是什么。这是我的源代码:
ASPX页面
<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="Item" />
<asp:CommandField ButtonType="Link" ShowSelectButton="true" SelectText="Click Me!" />
</Columns>
</asp:GridView>
代码背后:
string[] MyArray = new string[1];
MyArray[0] = "My Value";
MyGridView.DataSource = MyArray;
MyGridView.DataBind();
更新
我需要将AutoGenerateColumns
属性设置为false
,因为我需要生成其他asp:CommandField
列。我已更新我的代码示例以反映此方案
答案 0 :(得分:20)
经过几个小时的搜索,我终于发现这种情况有一个特殊的DataField:“!”
<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="!" />
</Columns>
</asp:GridView>
我希望有一天能帮助别人:)
答案 1 :(得分:13)
尝试使用TemplateField替换BoundField,如下所示:
<asp:TemplateField HeaderText="String Value">
<ItemTemplate>
<%# Container.DataItem %>
</ItemTemplate>
</asp:TemplateField>
BTW我从another question
取消了这个答案 2 :(得分:9)
一种方法是将一个带有单个命名字段的类传递给它。这样,你可以给它一个名字。
public class GridRecord
{
public string MyValue { get; set; }
}
然后将您的字符串数组转换为类
的列表string[] MyArray = new string[1];
MyArray[0] = "My Value";
List<GridRecord> MyList = (
from ar in myArray
select new GridRecord
{
MyValue = ar
}).ToList();
MyGridView.DataSource = MyList;
MyGridView.DataBind();
现在您可以命名您的DataField属性
<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="MyValue" />
</Columns>
</asp:GridView>
答案 3 :(得分:4)
这是一个使用旧DataGrid的完整示例...所以看起来“!”技巧已广泛实施。这在VS2008中的ASP.NET下工作。当然,只需替换正确的元素名称即可使用GridView。
<%@ Page
Language="C#"
AutoEventWireup="true"
CodeBehind="Default.aspx.cs"
Inherits="WebApplication2._Default"
%>
<%@Import
Namespace="System.Collections.Generic"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script type="text/C#" runat="server">
void initList()
{
List<String> myList = new List<String>();
myList.Add("Hello");
myList.Add("Chatting");
myList.Add("Goodbye");
Grid1.DataSource = myList;
Grid1.DataBind();
}
</script>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<%initList(); %>
<asp:DataGrid runat="server" ID="Grid1" AutoGenerateColumns="false">
<Columns>
<asp:BoundColumn DataField="!" DataFormatString="Data: {0}" HeaderText="Dyad"/>
</Columns>
</asp:DataGrid>
</form>
</body>
</html>
因此作为GridView,内部部分将是
<asp:GridView runat="server" ID="Grid1" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="!" DataFormatString="Data: {0}" HeaderText="Dyad"/>
</Columns>
</asp:GridView>
如果你来回切换,请注意VS2008(至少)不能在Designer.cs类中重新声明控件类型,因此如果只编辑元素名称,则必须手动更改。
答案 4 :(得分:1)
迈克尔,
代码行
<asp:BoundField DataField="Item" />
需要一个名为“Item”的列,如果您绑定到其中一个DataSource控件(如SqlDataSource,ObjectDataSource或LinqDataSource),则可以使用该列。由于您绑定了IEnumerable,因此没有这样的名称。