2013-04-22 3 views
1

Я пытаюсь добавить RepositoryItemCheckEdit в мой GridView с использованием devexpress и Winforms. Однако я могу проверить только один флажок. Если я проверю другой, флажок, который я проверил, не будет снят. Я следил за всем, что я могу найти в сети, но не смог выполнить эту работу. Что мне не хватает?RepositoryItemCheckEdit не проверяется

Код части вставить столбец:

gcIsEmirleri.DataSource = (from i in isemirleri 
          select new 
          { 
           ID = i.isEmriId, 
           // other attributes 
          }).ToList(); 

GridColumn column = gvIsEmirleri.Columns["Sec"]; 
if (column == null) 
{ 
    gvIsEmirleri.BeginUpdate(); 

    DataColumn col = new DataColumn("Sec", typeof(bool)); 
    column = gvIsEmirleri.Columns.AddVisible("Sec"); 
    col.VisibleIndex = 0; 
    col.Caption = "Sec"; 
    col.Name = "Sec"; 
    col.OptionsColumn.AllowEdit = true; 

    gvIsEmirleri.EndUpdate(); 


    gvIsEmirleri.Columns["Sec"].UnboundType = DevExpress.Data.UnboundColumnType.Boolean; 

    RepositoryItemCheckEdit chk = new RepositoryItemCheckEdit(); 
    chk.ValueChecked = true; 
    chk.ValueUnchecked = false; 
    gvIsEmirleri.Columns["Sec"].ColumnEdit = chk; 
    chk.QueryCheckStateByValue += chk_QueryCheckStateByValue; 
} 

Код часть I сделать чекбокс два заявил, вместо трех:

private void chk_QueryCheckStateByValue(object sender, DevExpress.XtraEditors.Controls.QueryCheckStateByValueEventArgs e) 
{ 
    if (e.Value == null) 
    { 
     e.CheckState = CheckState.Unchecked; 
     e.Handled = true; 
    } 
} 

EDIT: Я создал List<bool> chkList; и сделать следующие операции: Эта функция добавляется к контрольным номерам CheckStateChanged:

private void chk_CheckStateChanged(object sender, EventArgs e) 
{ 
    CheckEdit chk = sender as CheckEdit; 
    if (chk.Checked) 
     chkList[gvIsEmirleri.FocusedRowHandle] = true; 
    else 
     chkList[gvIsEmirleri.FocusedRowHandle] = false; 

    FillBindingSource(); 
} 

В FillBindingSource я добавил следующие строки:

for (int i = 0; i < chkList.Count; i++) 
{ 
    if (chkList[i]) 
     gvIsEmirleri.SetRowCellValue(i, "Sec", true); 
} 

Я отлаживать эти строки, я вижу, что List имеет значения правильно BOOL и gvIsEmirleri.SetRowCellValue(i, "Sec", true); работает, когда он должен. Однако он все еще не работает.

ответ

3

Мое предположение: вы используете несвязанный столбец, и вы не сохраняете отмеченную/незанятую информацию, поэтому после того, как выбранная строка оставлена, checkBox получит ее начальное значение (unckecked).

Для этого я предлагаю вам обработать событие CustomUnboundColumnData вашего вида. Вот простой:

readonly Dictionary<object, bool> checkedMap = new Dictionary<object, bool>(); 

private void viewScales_CustomUnboundColumnData(object sender, CustomColumnDataEventArgs e) 
{ 
    // Check what column 
    if (e.Column != gvIsEmirleri.Columns["Sec"]) 
     return; 

    if (e.IsGetData) 
    { 
      // check if the row has been checked and set it's value using e.Value 
      bool checked; 
      if (checkedMap.TryGetValue(e.Row, out checked)) 
       e.Value = checked; 
    } 

    if (e.IsSetData) 
    { 
      var checked = Convert.ToBoolean(e.Value); 

      // Check if the key already exist 
      if (checkedMap.ContainsKey(e.Row)) 
       scaleMap.Remove(e.Row); 

      checkedMap.Add(e.Row, checked); 
    } 
} 

Примечание: Это путь я решил подобную проблему, но я не проверял код, который я только что написал.

+0

, который работал, я использовал его со списком, а не с словарем. Спасибо, в любом случае! –

+0

Я прославился, это сработало для вас, удачи ^^ – SidAhmed

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