2016-12-29 2 views
2

У меня есть 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 всегда ложно. Мне нужно, чтобы и сортировка/пейджинг имели место И, чтобы иметь возможность считывать значение CheckedASPxCheckBox в DataItemTemplate.

ответ

2

Отредактированного ответ

Оказывается, что при использовании редакторов в DataItemTemplate вы должны используйте LoadPostData(), чтобы получить их значения.

Использование:

for(int i = 0; i < grid.VisibleRowCount; i++) 
{ 
    ASPxCheckBox checkbox = grid.FindRowCellTemplateControl(i, grid.Columns[0], "checkbox") as ASPxCheckBox; 

    ((IPostBackDataHandler)checkbox).LoadPostData(checkbox.UniqueID, Request.Form); 

    if(checkbox.Checked) 
    { 
     //Do conditional stuff 
    } 
} 

Что касается заполнения сетки, вы можете держать его внутри Page_Load без !IsPostBack, потому что он не влияет на редакторов (и он будет держать фильтрации/сортировки)

Это может вызвать проблемы в других случаях, но здесь это не так.

Надеюсь, это поможет! Скажите, пожалуйста, если у вас есть вопросы

+0

Я пробовал это, но он все еще не работает. При тестировании на 'button_Click'' grid.VisibleRowCount' = 2, вступая в цикл for и 'ASPxCheckBox checkbox = grid.FindRowCellTemplateControl (i, grid.Columns [0],« checkbox ») как ASPxCheckBox;' is 'null' , Проверка 'grid.VisibleRowCount' снова и теперь 0. Почему это произойдет? – anothershrubery

+0

Хорошо, похоже, у этой проблемы есть проблема с решением Valeh. На 'button_Click' страница отправлена ​​назад и, следовательно, не отскакивает от данных, и поэтому' grid.FindRowCellTemplateControl' возвращает null, как и 'grid.GetDataRow'. Это выглядит довольно раздражающим. – anothershrubery

+0

Это не имеет никакого отношения к решению Вале. Все данные сетки доступны (старые данные сетки не репопулируются) при обратной передаче, поэтому у вас есть 'VisibleRowCount', например.Проблема начинается, когда вы передаете данные обратно на сервер, не заполняя сетку еще раз, потому что она не может сохранить свое значение после отправки обратно клиенту. Я не уверен, почему вы устанавливаете флажок как null, но у меня есть ощущение, что это еще одна проблема. Я скоро посмотрю –

0

Потому что, когда вы нажимаете кнопку, то сообщение страницы на сервер и при отправке страницы на сервер все элементы управления устанавливаются на значение по умолчанию (если вы не контролируете свойство isPostBack). вы выполняете сортировку сетки на стороне клиента. но публикация на стороне сервера и рендеринг на стороне клиента, которую вы удалили. Вы можете использовать обратный вызов. Ex:

<dx:ASPxGridView ID="grid" runat="server" ClientInstanceName="grid" OnCustomCallback="ASPxGridView1_CustomCallback"> 
      <Columns> 
       <dx:GridViewDataColumn> 
        <DataItemTemplate> 
         <dx:ASPxCheckBox ID="checkbox" runat="server" /> 
        </DataItemTemplate> 
       </dx:GridViewDataColumn> 
      </Columns> 
    </dx:ASPxGridView> 


<dx:ASPxButton ID="btnSend" runat="server" AutoPostBack="False" Text="Send" Width="100px" ClientInstanceName="btnSend"> 
<ClientSideEvents Click="function(s, e) { grid.PerformCallback(); }" /> 
</dx:ASPxButton> 

код позади:

разницы
if (!IsPostBack) 
     { 
      //Some stuff 

      grid.DataSource = sourceTable; 

      grid.DataBind(); 

      //Other stuff 
     } 

protected void ASPxGridView1_CustomCallback(object sender, DevExpress.Web.ASPxGridViewCustomCallbackEventArgs e) 
    { 
     for (int i = 0; i < grid.VisibleRowCount; i++) 
     { 
      //Other stuff 

      ASPxCheckBox checkbox = grid.FindRowCellTemplateControl(i, grid.DataColumns[0], "checkbox") as ASPxCheckBox; 

      if (checkbox.Checked) //Always false 

      { 

       //Do conditional stuff 

      } 

      //More stuff 

     } 
    } 

шоу между обратным вызовом и обратной передачей в C# Difference between a Postback and a Callback

+0

Будет ли проверить это в ближайшее время, но мне кажется, что это все-таки перерыв сортировки? Потому что источник данных не связан с загрузкой страницы? На самом деле и кнопка не может работать здесь, потому что она не отправляет сообщения и поэтому не запускает код 'button_Click'. – anothershrubery

+0

Хорошо, ваше редактирование имеет больше смысла. но все еще чувствует, что сортировка будет нарушена. – anothershrubery

+0

Вы сортируете колоду checkBox или другую? –

0

Есть несколько вариантов.

Page_Init обработчик события

Вы можете попытаться переместить код привязки к Page_Init обработчика событий.

protected void Page_Init(object sender, EventArgs e) 
{ 
    grid.DataSource = sourceTable; 
    grid.DataBind(); 
} 

PostData из CheckBox редактор загружается между Page_Init и Page_Load, поэтому значения в вашем CheckBox столбце будут стерты в случае Page_Load после вызова к grid.DataBind метода.


GridViewCommandColumn с ShowSelectCheckbox = "истинный"

Вот еще одна возможность. Вы можете имитировать желаемое поведение, используя GridViewCommandColumn с ShowSelectCheckbox.

<dx:GridViewCommandColumn ShowSelectCheckbox="true" /> 

Вы можете использовать grid.Selection.IsRowSelected метод, чтобы получить проверенные строки.
Вот пример:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    //Some stuff 
    for (int i = 0; i < grid.VisibleRowCount; i++) 
    { 
     //Other stuff     
     if (grid.Selection.IsRowSelected(i)) 
     { 
      //Do conditional stuff 
     } 
     //More stuff 
    } 
    //Even more stuff 
} 
+0

'Page_Init' не работает, потому что он не реполяруется для сортировки/подкачки. 'GridViewCommandColumn' не подходит, так как это' DataItemTemplate' с более чем просто «ASPxCheckbox» в нем, и есть несколько похожих столбцов. Я просто уменьшил код для простоты. – anothershrubery

+0

@anothershrubery Я не могу воспроизвести вашу ситуацию. В моем тестовом проекте 'Page_Init' выполняет repopulate для сортировки/подкачки. – nempoBu4

+0

@anothershrubery В любом случае, метод LoadPostData, упомянутый в [answer] Jaqen H'ghar (http://stackoverflow.com/a/41446795/1805640), тоже работает. – nempoBu4

Смежные вопросы