Spread Winform 16.1 ChekcBox使用问题
本帖最后由 第10001个菜鸟 于 2023-6-14 08:39 编辑1.如何通过列标题上的复选框实现整列复选框的全选/全不选,我现在列头上设置的复选框无法编辑(勾选或取消勾选)
2.在遍历FpSpread内容时,如何获取复选框的勾选状态
急急急!!!!请知晓的大佬或官方大大指点一下
情况可以重现出来,看来是spread.net普通单元格会对bool值转换为大写的bool字符串以兼容excel(你可以尝试在excel中输入小写true,也会被转换为大写),实际参与计算时仍会被作为bool值。
那么你可以直接验证这个字符串是“True”“False”来判断是否勾选 1。列头单元格无法编辑,所以列头的复选框单元格同样是无法选中的。 你可以通过CellClick 事件,自己来判断点击的列头的复选框单元格。写代码来实现全选
fpSpread1.ActiveSheet.ColumnHeader.Cells.CellType=new CheckBoxCellType();
fpSpread1.ActiveSheet.ColumnHeader.Cells.Value = false;
fpSpread1.CellClick += (s, e) => {
var sheet = fpSpread1.ActiveSheet;
if (e.ColumnHeader && e.Row == 0 && e.Column == 0)
{
var value = sheet.ColumnHeader.Cells.Value;
sheet.ColumnHeader.Cells.Value = !(bool)sheet.ColumnHeader.Cells.Value;
for (int i = 0; i < sheet.RowCount; i++)
{
if(sheet.Cells.CellType is CheckBoxCellType)
{
sheet.Cells.Value = sheet.ColumnHeader.Cells.Value;
}
}
}
};
2.如上的代码就可以看出,复选框单元格的勾选状态实际就是单元格值(bool型) 本帖最后由 第10001个菜鸟 于 2023-6-12 16:43 编辑
Richard.Ma 发表于 2023-6-12 10:05
1。列头单元格无法编辑,所以列头的复选框单元格同样是无法选中的。 你可以通过CellClick 事件,自己来判断 ...
非常感谢您的帮助,在您的示例代码基础上,我进行了扩展,即当勾选单元格的复选框时,对列头复选框勾选状态进行更新,遇到以下两个问题
1.没有进行列头勾选对整列复选框状态进行更新的前提下(即直接点击单元格的复选框,点之前是未选中的状态),此时通过cellclick获取到的单元格复选框value值为null
2.通过cellclick事件列头复选框给单元格的复选框赋值后,当我获取单元格的复选框value时只能获取到字符串类型的true和false吗?无法转换为bool类型 1,是的,未选中时,有可能是null(初始状态),或者false(设置过false值),这个得你自己判断
2.如果单元格是一个复选框单元格类型,那么就应该是bool型的,如果是普通单元格,那么会是字符串 Richard.Ma 发表于 2023-6-12 17:03
1,是的,未选中时,有可能是null(初始状态),或者false(设置过false值),这个得你自己判断
2.如果 ...
如上述代码,我在页面上先点击了列头的复选框,让这一整列的复选框都有了一个初始值,这时我再去点击单元格中的复选框触发CellClick事件,此时获取到的Value值是字符串类型的True,而不是布尔类型
请上传一个demo,我明天帮你看一下 Richard.Ma 发表于 2023-6-12 18:25
请上传一个demo,我明天帮你看一下
public Form1()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("");
dt.Columns.Add("姓名");
dt.Columns.Add("年龄");
dt.Columns.Add("性别");
dt.Columns.Add("操作");
DataRow dataRow = dt.NewRow();
dataRow = "Tom";
dataRow = "20";
dataRow = "男";
dt.Rows.Add(dataRow);
dataRow = dt.NewRow();
dataRow = "Jerry";
dataRow = "10";
dataRow = "女";
dt.Rows.Add(dataRow);
dataRow = dt.NewRow();
dt.Rows.Add(dataRow);
dataRow = dt.NewRow();
dt.Rows.Add(dataRow);
dataRow = dt.NewRow();
dt.Rows.Add(dataRow);
dataRow = dt.NewRow();
dt.Rows.Add(dataRow);
dataRow = dt.NewRow();
dt.Rows.Add(dataRow);
dataRow = dt.NewRow();
dt.Rows.Add(dataRow);
dataRow = dt.NewRow();
dt.Rows.Add(dataRow);
dataRow = dt.NewRow();
dt.Rows.Add(dataRow);
//在指定位置插入数据源,这种方式可以在多个位置插入数据表,但是需要自己设置列名,且通过FpSpread的DataSource属性无法获取到数据源
//FarPoint.Win.Spread.Data.SpreadDataBindingAdapter data = new FarPoint.Win.Spread.Data.SpreadDataBindingAdapter();
//// Assign the datasource to a data table
//data.DataSource = dt;
//data.Spread = fpSpread1;
//data.SheetName = "Sheet1";
//data.MapperInfo = new FarPoint.Win.Spread.Data.MapperInfo(0, 1, dt.Rows.Count, dt.Columns.Count);
//data.FillSpreadDataByDataSource();
//data.DataSource = dt;
//data.Spread = fpSpread1;
//data.SheetName = "Sheet1";
//data.MapperInfo = new FarPoint.Win.Spread.Data.MapperInfo(30, 1, dt.Rows.Count, dt.Columns.Count);
//data.FillSpreadDataByDataSource();
fpSpread1.DataSource = dt;
FarPoint.Win.Spread.CellType.ComboBoxCellType productCboType = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
productCboType.Items = new string[] { "男", "女" };
//搜索下拉框内容
productCboType.AutoSearch = FarPoint.Win.AutoSearch.SingleCharacter;
productCboType.Editable = true;
fpSpread1.Sheets.Cells.CellType = productCboType;
ButtonCellType buttonCellType = new ButtonCellType();
buttonCellType.Text = "删除";
fpSpread1.Sheets.Cells.CellType = buttonCellType;
CheckBoxCellType chkboxcell = new FarPoint.Win.Spread.CellType.CheckBoxCellType();
chkboxcell.ThreeState = false;
chkboxcell.TextTrue = "Checked!";
chkboxcell.TextFalse = "Check";
chkboxcell.TextIndeterminate = "Not Sure";
fpSpread1.ActiveSheet.Cells.CellType = chkboxcell;
fpSpread1.ActiveSheet.ColumnHeader.Cells.CellType = chkboxcell;
fpSpread1.ActiveSheet.ColumnHeader.Cells.Value = false;
fpSpread1.CellClick += (s, e) =>
{
var sheet = fpSpread1.Sheets;
if (e.ColumnHeader && e.Row == 0 && e.Column == 0)
{
var value = sheet.ColumnHeader.Cells.Value;
sheet.ColumnHeader.Cells.Value = !(bool)sheet.ColumnHeader.Cells.Value;
for (int i = 0; i < sheet.RowCount; i++)
{
if (sheet.Cells.CellType is CheckBoxCellType)
{
sheet.Cells.Value = sheet.ColumnHeader.Cells.Value;
}
}
}
else
{
if (e.Column == 0 && sheet.Cells.CellType is CheckBoxCellType)
{
bool colCheck = true;
for (int i = 0; i < sheet.RowCount; i++)
{
if (sheet.Cells.CellType is CheckBoxCellType)
{
bool cellChk = (bool)sheet.Cells.Value;
if (!cellChk == false)
{
colCheck = false;
break;
}
}
}
sheet.ColumnHeader.Cells.Value = colCheck;
}
}
};
//不能在当前数据源占用单元格之外设置
fpSpread1.Sheets.SetValue(6, 0, "哈哈");
MessageBox.Show("cells.Value=" + fpSpread1.Sheets.Cells.Value + "\r\ncells.Value=" + fpSpread1.Sheets.Cells.Value);
}
private void FpCell_Click(object sender, CellClickEventArgs e)
{
MessageBox.Show("aaa");
}
private void fpSpread1_ComboSelChange(object sender, EditorNotifyEventArgs e)
{
FpCombo cbo = (sender as FpSpread).EditingControl2 as FpCombo;
MessageBox.Show(cbo.SelectedItem.ToString());
}
private void fpSpread1_ButtonClicked(object sender, EditorNotifyEventArgs e)
{
if ((sender as FpSpread).EditingControl2 is FpButton)
{
//删除当前行
fpSpread1.ActiveSheet.RemoveRows(e.Row, 1);
}
if ((sender as FpSpread).EditingControl2 is FpCheckBox)
{
FpCheckBox chk = (sender as FpSpread).EditingControl2 as FpCheckBox;
if (chk.Checked)
{
MessageBox.Show(fpSpread1.Sheets.Cells.Value == null ? "" : fpSpread1.Sheets.Cells.Value.ToString());
}
}
}
private void button1_Click(object sender, EventArgs e)
{
DataTable dt = fpSpread1.Sheets.DataSource as DataTable;
object value = fpSpread1.ActiveSheet.Cells.Value;
}
整个demo示例上传超过20M了,这是所有的.cs文件代码,前台页面只有一个button和FpSpread
Richard.Ma 发表于 2023-6-13 17:56
情况可以重现出来,看来是spread.net普通单元格会对bool值转换为大写的bool字符串以兼容excel(你可以尝试 ...
好的,我了解了,非常感谢您的帮助:handshake 不客气
页:
[1]