У меня есть ASPxGridView
, который содержит столбец с DataItemTemplate
, который содержит ASPxCheckBox
. Затем у меня есть кнопка вне сетки, которая выполняет некоторые действия на основе проверки флажка.ASPxGridView позволяет сортировать и DataItemTemplate с ASPxCheckBox
Сетка определяется как:
<dx:ASPxGridView ID="grid" runat="server">
<Columns>
<dx:GridViewDataColumn>
<DataItemTemplate>
<ds:ASPxCheckBox ID="checkbox" runat="server" />
</DataItemTemplate>
</dx:GridViewDataColumn>
<Columns>
</dx:ASPxGridView>
Сетка заполняется в Page_Load
как такового:
protected void Page_Load(object sender, EventArgs e)
{
//Some stuff
grid.DataSource = sourceTable;
grid.DataBind();
//Other stuff
}
Где sourceTable
определяется как:
public DataTable sourceTable
{
get
{
if (ViewState["sourceTable"] == null)
return new DataTable();
return (DataTable)ViewState["sourceTable"];
}
set
{
ViewState["sourceTable"] = value;
}
}
И заселена в другом месте. (Население не важно и работает)
Код реализован как таковой, чтобы обеспечить правильную сортировку и подкачку на сетке, как определено в различных разделах поддержки DevExpress. Это понятно. Однако, когда мы пытаемся получить значение Checked
из checkbox
на кнопку мыши, это всегда ложь:
protected void button_Click(object sender, EventArgs e)
{
//Some stuff
for(int i = 0; i < grid.VisibleRowCount; i++)
{
//Other stuff
ASPxCheckBox checkbox = grid.FindRowCellTemplateControl(i, grid.Columns[0], "checkbox") as ASPxCheckBox;
if(checkbox.Checked) //Always false
{
//Do conditional stuff
}
//More stuff
}
//Even more stuff
}
Я понимаю, почему это всегда ложь, как сетка выполняет повторную привязку данных и воссоздает флажок в состояние по умолчанию , любая документация, которую я нашел для этой проблемы относительно состояний DevExpress, обернуть привязку данных в Page_Load
в if(!Page.IsPostBack)
, которая действительно работает, но разбивает сортировку и подкачку.
Уверен, что у меня есть решение для этого в других проектах, которые я сделал, я просто не могу его найти. Что делать в этом случае?
Примечание: Я сократил код до такой степени, насколько мне может быть неприятно, и не проверил его. Могут быть некоторые небольшие ошибки с фактическим кодом, но использовать его как руководство к тому, что я пытаюсь сделать, и прояснить любые проблемы, с которыми могут столкнуться люди.
EDIT: Использование if(!Page.IsPostBack)
или if(!Page.IsCallback)
в Page_Load
остановках сортировки и пейджинговой на сетке, убрав это условие означает, что Checked
всегда ложно. Мне нужно, чтобы и сортировка/пейджинг имели место И, чтобы иметь возможность считывать значение Checked
ASPxCheckBox
в DataItemTemplate
.
Я пробовал это, но он все еще не работает. При тестировании на 'button_Click'' grid.VisibleRowCount' = 2, вступая в цикл for и 'ASPxCheckBox checkbox = grid.FindRowCellTemplateControl (i, grid.Columns [0],« checkbox ») как ASPxCheckBox;' is 'null' , Проверка 'grid.VisibleRowCount' снова и теперь 0. Почему это произойдет? – anothershrubery
Хорошо, похоже, у этой проблемы есть проблема с решением Valeh. На 'button_Click' страница отправлена назад и, следовательно, не отскакивает от данных, и поэтому' grid.FindRowCellTemplateControl' возвращает null, как и 'grid.GetDataRow'. Это выглядит довольно раздражающим. – anothershrubery
Это не имеет никакого отношения к решению Вале. Все данные сетки доступны (старые данные сетки не репопулируются) при обратной передаче, поэтому у вас есть 'VisibleRowCount', например.Проблема начинается, когда вы передаете данные обратно на сервер, не заполняя сетку еще раз, потому что она не может сохранить свое значение после отправки обратно клиенту. Я не уверен, почему вы устанавливаете флажок как null, но у меня есть ощущение, что это еще одна проблема. Я скоро посмотрю –