新增:单元格编辑完成回调;单击第一列选中整行

This commit is contained in:
睿 安
2026-01-28 16:51:51 +08:00
parent abcfc78596
commit 2ff880c267
17 changed files with 149 additions and 122 deletions

View File

@@ -310,6 +310,11 @@ namespace ezui {
if (m_firstColumnType == FirstColumnType::CheckBox && row < (int)m_rowChecked.size() && m_rowChecked[row]) {
backColor = SelectedRowBackColor;
}
// 如果第一列不是 CheckBox 且当前行被选中,使用选中行背景色
if (m_firstColumnType != FirstColumnType::CheckBox && row == m_selectedRow) {
backColor = SelectedRowBackColor;
}
// 绘制背景
g.SetColor(backColor);
@@ -365,11 +370,16 @@ namespace ezui {
// 确定背景色
Color backColor = m_cellBackColor;
// 如果第一列是 CheckBox 且选中,使用选中行背景色(优先级低)
// 如果第一列是 CheckBox 且选中,使用选中行背景色
if (m_firstColumnType == FirstColumnType::CheckBox && row < (int)m_rowChecked.size() && m_rowChecked[row]) {
backColor = SelectedRowBackColor;
}
// 如果第一列不是 CheckBox 且当前行被选中,使用选中行背景色
if (m_firstColumnType != FirstColumnType::CheckBox && row == m_selectedRow) {
backColor = SelectedRowBackColor;
}
// 如果单元格有独立背景色,使用独立设置(优先级高)
if (cellData.Style.HasBackColor) {
backColor = cellData.Style.BackColor;
@@ -487,6 +497,20 @@ namespace ezui {
EndEdit(true); // 结束之前的编辑
// 保存编辑前的原始值
if (colInfo.Type == CellType::TextBox) {
m_editOriginalValue = m_data[row][col].Text;
} else if (colInfo.Type == CellType::CheckBox) {
m_editOriginalValue = m_data[row][col].Checked ? L"true" : L"false";
} else if (colInfo.Type == CellType::ComboBox) {
int idx = m_data[row][col].ComboIndex;
if (idx >= 0 && idx < (int)colInfo.ComboItems.size()) {
m_editOriginalValue = colInfo.ComboItems[idx];
} else {
m_editOriginalValue = L"";
}
}
m_editing = true;
m_editRow = row;
m_editCol = col;
@@ -558,12 +582,22 @@ namespace ezui {
return;
}
if (save && m_editRow >= 0 && m_editCol >= 0) {
if (m_editRow < (int)m_data.size() && m_editCol < (int)m_data[m_editRow].size()) {
const auto& colInfo = m_columns[m_editCol];
int editRow = m_editRow;
int editCol = m_editCol;
UIString newValue;
if (save && editRow >= 0 && editCol >= 0) {
if (editRow < (int)m_data.size() && editCol < (int)m_data[editRow].size()) {
const auto& colInfo = m_columns[editCol];
if (colInfo.Type == CellType::TextBox) {
m_data[m_editRow][m_editCol].Text = m_editBox->GetText();
UpdateRowHeight(m_editRow);
newValue = m_editBox->GetText();
m_data[editRow][editCol].Text = newValue;
UpdateRowHeight(editRow);
// 触发编辑完成回调
if (CellEditFinished && newValue != m_editOriginalValue) {
CellEditFinished(editRow, editCol, m_editOriginalValue, newValue);
}
}
}
}
@@ -942,6 +976,7 @@ namespace ezui {
// 点击第一列
if (col == -1) {
if (m_firstColumnType == FirstColumnType::CheckBox && row < (int)m_rowChecked.size()) {
// CheckBox 模式:切换该行的选中状态
m_rowChecked[row] = !m_rowChecked[row];
// 更新全选状态
@@ -954,6 +989,10 @@ namespace ezui {
}
m_headerSelectAll = allChecked;
Invalidate();
} else if (m_firstColumnType != FirstColumnType::CheckBox) {
// 非 CheckBox 模式:单击选中当前行
m_selectedRow = row;
Invalidate();
}
return;
@@ -1452,6 +1491,22 @@ namespace ezui {
return result;
}
int TableView::GetSelectedRow() const {
return m_selectedRow;
}
void TableView::SetSelectedRow(int row) {
if (row >= -1 && row < (int)m_data.size()) {
m_selectedRow = row;
Invalidate();
}
}
void TableView::ClearSelection() {
m_selectedRow = -1;
Invalidate();
}
void TableView::SelectAll() {
if (m_firstColumnType == FirstColumnType::CheckBox) {
m_headerSelectAll = true;