📄 datagridcomboboxcolumn.h
字号:
#pragma once
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Diagnostics;
using namespace System::Windows::Forms;
using namespace System::Drawing;
using namespace System::Data;
using namespace System::Collections;
namespace My
{
/// <summary>
/// DataGridComboBoxColumn 摘要
/// </summary>
__gc public class DataGridComboBoxColumn : public System::Windows::Forms::DataGridColumnStyle
{
public:
DataGridComboBoxColumn(void)
{
InitializeComponent();
}
DataGridComboBoxColumn(System::ComponentModel::IContainer *container) : components(0)
{
/// <summary>
/// Windows.Forms 类撰写设计器支持所必需的
/// </summary>
container->Add(this);
InitializeComponent();
}
protected:
void Dispose(Boolean disposing)
{
if (disposing && components)
{
components->Dispose();
}
__super::Dispose(disposing);
}
private:
/// <summary>
/// 必需的设计器变量。
/// </summary>
System::ComponentModel::Container *components;
public:
ComboBox* _comboBox;
private:
int _xMargin;// = 2;
int _yMargin;// = 1;
String* _oldValue;//="";
bool _inEdit;//= false;
DataTable* _dataTable;
String* _displayMember;
String* _valueMember;
/// <summary>
/// 设计器支持所需的方法 - 不要用代码编辑器
///修改此方法的内容。
/// </summary>
void InitializeComponent(void)
{
components = new System::ComponentModel::Container();
}
//---------------------------成员方法------------------------------------
public:
DataGridComboBoxColumn(String* colName, DataTable* dataSource, String* displayMember, String* valueMember, DataGrid* dataGrid)
{
InitializeComponent();
_xMargin = 2;
_yMargin = 1;
_inEdit = false;
_comboBox = new ComboBox();
_comboBox->Visible = false;
_comboBox->DataSource = dataSource;
_dataTable = dataSource;
_comboBox->DisplayMember = displayMember;
_displayMember=displayMember;
_valueMember=valueMember;
_comboBox->ValueMember = valueMember;
_comboBox->DropDownStyle = ComboBoxStyle::DropDownList;
Graphics* _graphicsContext=dataGrid->CreateGraphics();
float _widest=0;
SizeF _stringSize;// = new SizeF(0,0);
for(int i = 0;i < dataSource->Rows->Count;i++)
{
_stringSize = _graphicsContext->MeasureString(dataSource->Rows->Item[i]->Item[displayMember]->ToString(), dataGrid->Font);
if (_stringSize.Width > _widest)
{
_widest = _stringSize.Width;
}
}
_comboBox->DropDownWidth = (int)Math::Ceiling(_widest);
this->Width = _comboBox->DropDownWidth + 25; // Add the space for the dropdown arrow
this->MappingName = colName;
this->HeaderText = colName;
dataGrid->Controls->Add(_comboBox);
}
/// <summary>
/// Standard override
/// </summary>
/// <param name="rowNum"></param>
protected:
void Abort(int rowNum) {
_inEdit = false;
_comboBox->Hide();
}
/// <summary>
/// Standard override
/// </summary>
/// <param name="dataSource"></param>
/// <param name="rowNum"></param>
/// <returns></returns>
bool Commit(CurrencyManager* dataSource,int rowNum)
{
if(!_inEdit)
{
return true;
}
try
{
Object* _value = _comboBox->SelectedValue;
if(NullText->Equals(_value))
{
_value = System::Convert::DBNull;
}
this->SetColumnValueAtRow(dataSource, rowNum, _value);
}
catch(...)
{
return false;
}
__finally
{
_inEdit = false;
_comboBox->Hide();
}
return true;
}
/// <summary>
/// Standard override
/// </summary>
/// <param name="source"></param>
/// <param name="rowNum"></param>
/// <param name="bounds"></param>
/// <param name="readOnly"></param>
/// <param name="instantText"></param>
/// <param name="cellIsVisible"></param>
void Edit(CurrencyManager* source, int rowNum, Rectangle bounds, bool readOnly, String* instantText, bool cellIsVisible)
{
_comboBox->Text = "";
Rectangle _originalBounds = bounds;
_oldValue = _comboBox->Text;
if(!cellIsVisible) return;
bounds.Offset(_xMargin, _yMargin);
bounds.Width -= _xMargin * 2;
bounds.Height -= _yMargin;
_comboBox->Bounds = bounds;
_comboBox->Visible = true;
//_comboBox.BringToFront();
//_comboBox.Focus();
_comboBox->SelectedValue = GetText(GetColumnValueAtRow(source, rowNum));
if(instantText != NULL)
{
_comboBox->SelectedValue = instantText;
int End = _comboBox->Text->Length;
_comboBox->Select(End, 0);
}
else
{
_comboBox->SelectAll();
}
//this.DataGridTableStyle.DataGrid.Invalidate(OriginalBounds);
//_comboBox.BringToFront();
_inEdit = true;
}
/// <summary>
/// Standard override
/// </summary>
/// <returns></returns>
int GetMinimumHeight() {
return _comboBox->PreferredHeight + _yMargin;
}
/// <summary>
/// Standard override
/// </summary>
/// <param name="g"></param>
/// <param name="val"></param>
/// <returns></returns>
int GetPreferredHeight(Graphics* g ,Object* val)
{
return FontHeight + _yMargin;
}
/// <summary>
/// Standard override
/// </summary>
/// <param name="g"></param>
/// <param name="val"></param>
/// <returns></returns>
Size GetPreferredSize(Graphics* g, Object* val)
{
Size _extents = Size::Ceiling(g->MeasureString(GetText(val), this->DataGridTableStyle->DataGrid->Font));
_extents.Width += _xMargin * 2 ;
_extents.Height += _yMargin;
return _extents;
}
/// <summary>
/// Standard override
/// </summary>
/// <param name="g"></param>
/// <param name="bounds"></param>
/// <param name="source"></param>
/// <param name="rowNum"></param>
void Paint(Graphics* g,Rectangle bounds,CurrencyManager* source,int rowNum)
{
Paint(g, bounds, source, rowNum, false);
}
/// <summary>
/// Standard override
/// </summary>
/// <param name="g"></param>
/// <param name="bounds"></param>
/// <param name="source"></param>
/// <param name="rowNum"></param>
/// <param name="alignToRight"></param>
void Paint(Graphics* g,Rectangle bounds,CurrencyManager* source,int rowNum, bool alignToRight)
{
String* _text = GetText(GetColumnValueAtRow(source, rowNum));
for(int i = 0;i < _dataTable->Rows->Count;i++)
{
if(_dataTable->Rows->Item[i]->Item[_valueMember]->ToString() == _text)
{
_text = _dataTable->Rows->Item[i]->Item[_displayMember]->ToString();
break;
}
}
PaintText(g, bounds, _text, alignToRight);
}
// Helper functions
private:
void PaintText(Graphics* g ,Rectangle bounds, String* text,bool alignToRight)
{
Brush* _backBrush = new SolidBrush(this->DataGridTableStyle->BackColor);
Brush* _foreBrush= new SolidBrush(this->DataGridTableStyle->ForeColor);
Rectangle _rect = bounds;
RectangleF _rectF = RectangleF::op_Implicit(_rect);
StringFormat* _format = new StringFormat();
if(alignToRight) {
_format->FormatFlags = StringFormatFlags::DirectionRightToLeft;
}
switch(this->Alignment) {
case HorizontalAlignment::Left:
_format->Alignment = StringAlignment::Near;
break;
case HorizontalAlignment::Right:
_format->Alignment = StringAlignment::Far;
break;
case HorizontalAlignment::Center:
_format->Alignment = StringAlignment::Center;
break;
}
_format->FormatFlags =StringFormatFlags::NoWrap;
g->FillRectangle(_backBrush, _rect);
_rect.Offset(0, _yMargin);
_rect.Height -= _yMargin;
g->DrawString(text, this->DataGridTableStyle->DataGrid->Font, _foreBrush, _rectF, _format);
_format->Dispose();
}
String* GetText(Object* val)
{
if(val == System::DBNull::Value)
{
return this->NullText;
}
if(val != NULL)
{
return val->ToString();
}
else
{
return String::Empty;
}
}
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -