unvell / ReoGrid

Fast and powerful .NET spreadsheet component, support data format, freeze, outline, formula calculation, chart, script execution and etc. Compatible with Excel 2007 (.xlsx) format and working on .NET 3.5 (or client profile), WPF and Android platform.
https://reogrid.net
MIT License
1.32k stars 390 forks source link

How to implement CheckBox cell type for entire column. #515

Open kpenigar opened 8 months ago

kpenigar commented 8 months ago

I am unable to get the checkbox cell type to persist for an entire column.

case (int)Headers.IsOpen:
  SetColumnWidth(colIndex, 1);
  var header = Grid.CurrentWorksheet.ColumnHeaders[colIndex];
  header.DefaultCellBody = typeof(CheckBoxCell);
  header.Style.HorizontalAlign = ReoGridHorAlign.Center;
  break;
jingwood commented 8 months ago

Hi @kpenigar. Thanks for your donation! Could you please provide more details about your issue?

I understand that you want to display checkboxes in all cells of a specific column. Your approach is on the right track. After setting DefaultCellBody to use checkboxes, you should assign a boolean value (true or false) to each cell in the column. Here's an example:

int dataCount = 10; // Number of rows
for (int i = 0; i < dataCount; i++)
{
  sheet[i, 0] = false; // Assigns false to each cell in the first column
}

This code will populate the first column with unchecked checkboxes for the first 10 rows. Please adjust dataCount based on the actual number of rows in your sheet.

The result: image

kpenigar commented 8 months ago

Thanks for the quick response.

Context: I pull data from a database into the spreadsheet and then configure the spreadsheet, so I don't assign the default body style until all the data is loaded. The "IsOpen" field has a data type of Bit (0, 1).

jingwood commented 8 months ago

Did my answer resolve your question? Given your context, here is another example:

// Assuming `sheet` is the current worksheet and data is loaded
int columnIndexOfIsOpen = [Column Index of IsOpen]; // Replace with actual column index
for (int i = 0; i < sheet.RowCount; i++)
{
    object dbValue = sheet[i, columnIndexOfIsOpen]; // Get value from cell
    bool checkboxValue = Convert.ToBoolean(dbValue); // Convert DB Bit value to boolean
    sheet[i, columnIndexOfIsOpen] = checkboxValue; // Assign boolean value to cell
    // Optionally, set the cell body to CheckBoxCell if not already done
    sheet.SetCellBody(i, columnIndexOfIsOpen, new CheckBoxCell());
}

In this example you don't have to use Header.DefaultCellBody field, just set each checkbox into cells manually.

kpenigar commented 8 months ago

Ok, I'll try to implement your suggestion and let you know.

Thanks again for your help.

jingwood commented 8 months ago

Yes, when you use Header.DefaultCellBody, you don't have to set checkbox instances. Instead, if you set a boolean value to true or false, ReoGrid will automatically create the checkbox instance for you. Both methods achieve the same result.

kpenigar commented 8 months ago

So I guess it probably would be more efficient if I did the data conversion on the server side, that way when the data's loaded it's already in the right format.