2015-11-02 3 views
1

Я пытаюсь добавить новый столбец флажка в ultrawingrid, который привязан к набору данных, когда когда-либо добавляю новый столбец, он говорит, что ключ не найден, любой идеи о том, как это исправить, спасибо ...Добавление столбца флажка к infragistics ultrawingrid, привязанного к источнику данных

Ниже приведен код

private void grdPayVis_InitializeLayout(object sender, InitializeLayoutEventArgs e) 
{ 

    var gridBand = grdPayVis.DisplayLayout.Bands[0]; 

    gridBand.Columns["Select"].Header.Caption = "Select"; 
    gridBand.Columns["Select"].Header.Appearance.TextHAlign = HAlign.Center; 
    gridBand.Columns["Select"].Header.VisiblePosition = 0; 
    gridBand.Columns["Select"].Hidden = false; 
    gridBand.Columns["Select"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.CheckBox; 
    gridBand.Columns["Select"].AutoSizeMode = ColumnAutoSizeMode.AllRowsInBand; 
    gridBand.Columns["Select"].CellActivation = Activation.AllowEdit; 
    gridBand.Columns["Select"].CellAppearance.TextHAlign = HAlign.Center; 
    gridBand.Columns["Select"].CellClickAction = CellClickAction.Edit; 

} 

Swetha

ответ

1

Когда сетка имеет свой источник данных установлен в DataTable или другого источника связывания, он автоматически создает столбцы, присутствующие в данных или в свойствах e datasource. Если вы хотите иметь еще один столбец, вам нужно добавить его, прежде чем пытаться ссылаться на него из колонок Ленточные

private void grdPayVis_InitializeLayout(object sender, InitializeLayoutEventArgs e) 
{ 
    var gridBand = grdPayVis.DisplayLayout.Bands[0]; 

    // Check if the column exists, if not, add it 
    if(!gridBand.Columns.Exists("Select")) 
     gridBand.Columns.Add("Select", "Select"); 


    // Not needed, the ADD adds the Key and the Caption 
    // gridBand.Columns["Select"].Header.Caption = "Select"; 

    // Now you can reference the column with the Key = "Select" 
    gridBand.Columns["Select"].Header.VisiblePosition = 0; 
    gridBand.Columns["Select"].Hidden = false; 
    gridBand.Columns["Select"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.CheckBox; 
    gridBand.Columns["Select"].AutoSizeMode = ColumnAutoSizeMode.AllRowsInBand; 
    gridBand.Columns["Select"].CellClickAction = CellClickAction.Edit; 
} 
+0

Большое спасибо за ответ. Он отлично работает, но при загрузке флажки всегда выбираются с помощью мини-синего квадрата с полем проверки, как я могу удалить это ... Надеюсь, мой вопрос ясен, если не понравится дай мне знать... – Agasthya

+0

Понятно. CheckBox не привязан к какому-либо столбцу, поэтому его начальное значение является inderteminate. Вы можете установить начальное значение, указанное для этого флажка, используя метод InitializeRow или добавить в источник привязки логический столбец с начальным значением true/false. Если возможно, предпочтете этот последний подход. – Steve

+0

Большое спасибо за ответ, я сначала попытался добавить столбец в таблицу, но я не могу правильно получить значение этой выбранной ячейки, я всегда получаю это значение как ложное, даже когда я проверяю ячейку – Agasthya

0

ответ Стива выше это хорошо, но это может быть упрощен и лучше несколькими способами.

Во-первых, многие из этого кода не нужны. Например, по умолчанию для скрытого состояния столбца указано значение false, поэтому нет необходимости устанавливать это. То же самое для AutoSizeMode и CellClickAction.

Кроме того, если вы добавляете несвязанный столбец, по умолчанию DataType является строкой, что не имеет особого смысла для столбца CheckBox. Установив DataType на bool, вы можете избежать необходимости устанавливать стиль, а также очищать проблему, когда каждая ячейка является неопределенной по умолчанию.

private void ultraGrid1_InitializeLayout(object sender, Infragistics.Win.UltraWinGrid.InitializeLayoutEventArgs e) 
    { 
     UltraGridLayout layout = e.Layout; 
     UltraGridBand rootBand = layout.Bands[0]; 

     if (false == rootBand.Columns.Exists("Select")) 
     { 
      UltraGridColumn checkBoxColumn = rootBand.Columns.Add("Select"); 
      checkBoxColumn.Header.VisiblePosition = 0; 
      checkBoxColumn.DataType = typeof(bool); 
     } 
    } 

Что касается определения значения ячейки и отслеживающих «выбранных» строк, вы должны понимать, немного о том, как работают ячейки сетки редакторов. Чтобы это понять, представьте себе ячейку, содержащую информацию DateTime. Пользователь вводит ячейку и намеревается ввести дату, например '1/19/2015'. Когда пользователь начинает печатать, он начинает с ввода «1». Если вы проверите значение ячейки в этот момент, сетка не сможет преобразовать текущий текст в ячейку («1») в дату. Поэтому из-за этого сетка не пытается обновить базовый источник данных до значения, пока не произойдет что-то еще, например, если пользователь покидает ячейку или теряет фокус на сетке.

Конечно, если ячейка имеет флажок, эта проблема не существует, поскольку пользователь не может ввести недопустимое значение, но сетка по-прежнему работает одинаково и не обновляет значение до тех пор, пока пользователь покидает ячейку.

Итак ... когда вы имеете дело с любой ячейкой, которая НЕ находится в режиме редактирования (в настоящее время не активна), вы можете надежно использовать свойство Value ячейки. Когда ячейка находится в режиме редактирования (активна), вы не можете полагаться на значение, которое читается из источника данных, вам нужно использовать текст ячейки.

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

private bool GetCheckBoxCellCurrentValue(UltraGridCell cell) 
    { 
     if (cell.IsInEditMode) 
      return bool.Parse(cell.Text); 
     else 
      return (bool)cell.Value; 
    } 

Наконец, сетка не хранит какой-либо список «проверенных» ячеек. Но вы могли бы сделать это самостоятельно, не слишком много. Вам нужно будет создать исходный список сразу после привязки сетки. Затем включайте события, такие как CellChange, AfterRowAdded, BeforeRowDeleted и, возможно, некоторые другие, чтобы постоянно обновлять свой список.