Что такое dataKeyName для вида сетки, привязанного к массиву строк?
Может кто-нибудь дать мне короткий фрагмент, который, учитывая GridView, который изначально был связан с простым строковым массивом, и учитывая строку GridViewRow, будет возвращать значение, которое было привязано к строке?
1 ответ
Вы не можете, единственное свойство System.String имеет Length, а 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 для создания временного списка, который включает в себя только ваше значение как свойство класса. Вот пример такой техники на форумах MSDN от vtcoder.
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();
Тогда "Имя" будет DataKeyName и BoundField DataField.