Winforms RepositoryItemCheckEdit不';Don’不要久留
我尝试使用Winforms RepositoryItemCheckEdit不';Don’不要久留,winforms,devexpress,devexpress-windows-ui,Winforms,Devexpress,Devexpress Windows Ui,我尝试使用devexpress和Winforms将RepositoryItemCheckEdit添加到我的GridView。但是,我只能选中一个复选框。如果我选中另一个复选框,则我之前选中的复选框将变为未选中。我在网上找到了所有我能找到的东西,但都没有成功。我错过了什么 代码第一部分插入列: gcIsEmirleri.DataSource = (from i in isemirleri select new
devexpress
和Winforms
将RepositoryItemCheckEdit
添加到我的GridView
。但是,我只能选中一个复选框。如果我选中另一个复选框,则我之前选中的复选框将变为未选中。我在网上找到了所有我能找到的东西,但都没有成功。我错过了什么
代码第一部分插入列:
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;
}
代码第一部分中,复选框由三个改为两个:
private void chk_QueryCheckStateByValue(object sender, DevExpress.XtraEditors.Controls.QueryCheckStateByValueEventArgs e)
{
if (e.Value == null)
{
e.CheckState = CheckState.Unchecked;
e.Handled = true;
}
}
编辑:我创建了一个列表chkList
并执行以下操作:
此函数添加到checkedits“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);
}
for(int i=0;i
我调试这些行,我看到
List
有正确的bool值和gvIsEmirleri.SetRowCellValue(I,“Sec”,true)代码>在必须时操作。然而,它仍然不起作用 我的猜测是:您使用的是一个未绑定的列,并且您没有保存选中/未选中的信息,因此,在选中的行离开后,复选框
将获取其初始值(未选中)
为此,我建议您处理视图中的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);
}
}
readonly Dictionary checkedMap=new Dictionary();
私有void viewScales_CustomUnboundColumnData(对象发送方,CustomColumnDataEventArgs e)
{
//检查哪一列
如果(e.Column!=gvIsEmirleri.Columns[“Sec”])
返回;
if(例如IsGetData)
{
//检查行是否已被选中,并使用e.value设置其值
布尔检查;
if(checkedMap.TryGetValue(例如,行,检出))
e、 值=已检查;
}
如果(如IsSetData)
{
选中的var=转换为ToBoolean(即值);
//检查密钥是否已存在
如果(选中地图容器箱(e.Row))
缩放映射移除(e.Row);
checkedMap.Add(如行,选中);
}
}
注意:这是我解决类似问题的方法,但我没有测试我刚刚编写的代码。这很有效,我将其用于列表,而不是字典。无论如何谢谢你!