Нельзя, единственное свойство System.String имеет длину, а DataKeyName ожидает свойство объекта, к которому привязывается. Чтобы ответить на ваш второй вопрос, вот пример получения строкового значения из GridViewRow.
В вашем файле ASPX:
<asp:GridView ID="GridView1" runat="server"
OnRowDataBound="GridView1_RowDataBound" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="String Value">
<ItemTemplate>
<%# Container.DataItem %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
В вашем коде:
protected void Page_Load(object sender, EventArgs e) {
string[] arrayOfStrings = new string[] { "first", "second", "third" };
GridView1.DataSource = arrayOfStrings;
GridView1.DataBind();
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) {
if (e.Row.RowType == DataControlRowType.DataRow) {
// e.Row is of type GridViewRow
// e.Row.DataItem contains the original value that was bound,
// but it is of type object so you'll need to cast it to a string.
string value = (string)e.Row.DataItem;
}
}
Единственный разумный способ решения этой проблемы - создать класс-оболочку со свойствами. Или, если вы используете .NET 3.5, вы можете использовать LINQ для создания временного списка, который включает в себя только ваше значение как свойство класса. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *...
List<string> names = new List<string>(new string[] { "John", "Frank", "Bob" });
var bindableNames = from name in names
select new {Names=name};
GridView1.DataSource = bindableNames.ToList();
Тогда «Name» будет DataKeyName и BoundField DataField.