Так как пробел имеет семантическое значение в Python, некоторые методы перехода на новую строку могли привести к неправильным или неоднозначным результатам, таким образом, должен быть некоторый предел для предотвращения тех ситуаций. 80 символьных длин строки были стандартными, так как мы использовали телетайпы, таким образом, 79 символов походят на довольно безопасный выбор.
Проблема в том, что когда для свойства Visibility BoundField
установлено значение false, столбец не отображается для клиента. Чтобы обойти эту проблему, можно вместо этого использовать HiddenField
внутри TemplateField
.
<asp:TemplateField>
<ItemTemplate>
<asp:HiddenField ID="HiddenField1" runat="server"
Value='<%# Eval("BirthDate") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:HiddenField ID="HiddenField1" runat="server"
Value='<%# Eval("BirthDate") %>' />
</EditItemTemplate>
</asp:TemplateField>
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e)
{
GridViewRow row = GridView.Rows[e.NewEditIndex];
HiddenField hidden = (HiddenField)row.Cells[0].FindControl("HiddenField1");
DateTime birthDate = Convert.ToDateTime(hidden.Value);
}
EDIT
Вышеупомянутый метод по-прежнему отображает столбец в таблице, поэтому вы получите пустой столбец. Это работает, но не лучшее решение. Вот способ скрыть поле BirthDate, но все равно получить его значение в обработчике событий RowEditing
. Просто имейте в виду, что BirthDate по-прежнему отображается для клиента, но не отображается.
<style type="text/css">
.hide
{
display:none;
}
</style>
<asp:BoundField DataField="BirthDate">
<ItemStyle CssClass="hide"/>
</asp:BoundField>
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e)
{
GridViewRow row = GridView1.Rows[e.NewEditIndex];
DateTime birthDate = Convert.ToDateTime(row.Cells[1].Text);
}
Я сделал что-то вроде этого (адаптируясь к вашему примеру):
string[] keyList = new string[1];
keyList[0] = "BirthDate";
myGridView.DataKeyNames = keyList;
Затем я связал GridView с DataTable, у которого есть столбец с именем «BirthDate». Данные в этом столбце будут храниться с указанным выше DataKeyName.
Чтобы получить желаемое значение, я бы сделал что-то вроде этого:
protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e)
{
DataKeyArray keyList = myGridView.DataKeys as DataKeyArray;
if (keyList != null)
DateTime birthDate = keyList[e.NewEditIndex];
}
Я понимаю, что это не касается скрытых полей, однако.
Ознакомьтесь со следующей статьей, в которой показано, как получить доступ к невидимым столбцам GridView:
http://www.highoncoding.com/Articles /178_Access_GridView_Invisible_Columns.aspx
Идея состоит в том, чтобы в основном использовать столбец TemplateField вместо BoundColumn.
это один из способов получить данные из базовых данных
protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e)
{
GridViewRow row = gvUsers.Rows[e.NewEditIndex];
DateTime birthDate = Convert.ToDateTime(DataBinder.Eval(row.DataItem, "BirthDate"));
}
Я бы использовал предложение скрытого поля, которое предложил Федрус, а затем в вашем коде; используйте что-то вроде этого:
GridViewRow row = gvUsers.Rows[e.NewEditIndex];
var hfBirthDate = (HiddenField)row.FindControl("hfBirthDate");
DateTime birthDate = DateTime.Parse(hfBirthDate.Value);