⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datagridcomboboxcolumn.h

📁 Visual C++.net数据库开发经典案例
💻 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 + -