powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ComboBox в DataGrid (WinForms)
14 сообщений из 14, страница 1 из 1
ComboBox в DataGrid (WinForms)
    #32838568
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот класс:
using System;
using System.Windows.Forms;
using System.Drawing;
namespace testGrid
{

public class clmnComboBox: DataGridColumnStyle
{
private ComboBox MyCombo=new ComboBox();

private bool isEditing;

public clmnComboBox(System.Data.DataTable ComboDataSource,
string ComboDisplayMember,string ComboValueMember):base()
{
MyCombo.DataSource=ComboDataSource;
MyCombo.DisplayMember=ComboDisplayMember;
MyCombo.ValueMember=ComboValueMember;
MyCombo.Visible=true;
MyCombo.Invalidate();
MyCombo.DropDownStyle=ComboBoxStyle.DropDownList;


}


protected override void Abort(int rowNum)
{

//MessageBox.Show("1");
isEditing = false;
MyCombo.SelectedValueChanged-=new EventHandler(MyCombo_SelectedIndexChanged);
Invalidate();

}

protected override bool Commit(CurrencyManager dataSource, int rowNum)
{
//MessageBox.Show("2");
MyCombo.Bounds=System.Drawing.Rectangle.Empty;
MyCombo.SelectedValueChanged-=new EventHandler(MyCombo_SelectedIndexChanged);

if (!isEditing) return true;
isEditing = false;
try
{
int value=(int)MyCombo.SelectedValue;
SetColumnValueAtRow(dataSource, rowNum, value);


}
catch(Exception)
{
Abort(rowNum);
return false;
}
Invalidate();
return true;
}
protected override void Edit(CurrencyManager source,int rowNum,Rectangle bounds,bool readOnly,string instantText,bool cellIsVisible)
{
//MessageBox.Show(rowNum.ToString());


int value =(int)GetColumnValueAtRow(source, rowNum);

if (cellIsVisible)
{
MyCombo.Bounds = new Rectangle
(bounds.X , bounds.Y ,
bounds.Width, bounds.Height );
MyCombo.SelectedValue = value;
MyCombo.SelectedValueChanged +=
new EventHandler(MyCombo_SelectedIndexChanged);
MyCombo.Visible = true;

}
else
{

MyCombo.SelectedValue = value;
MyCombo.Visible = false;
}
if (MyCombo.Visible)
DataGridTableStyle.DataGrid.Invalidate(bounds);



}



protected override Size GetPreferredSize(Graphics g,object value)
{

return new Size(100, MyCombo.PreferredHeight );
}
protected override int GetMinimumHeight()
{

return MyCombo.PreferredHeight;
}
protected override int GetPreferredHeight(Graphics g,object value)
{

return MyCombo.PreferredHeight;
}
protected override void Paint(Graphics g,Rectangle bounds,CurrencyManager source,int rowNum)
{
//MessageBox.Show("P1");

Paint(g, bounds, source, rowNum, false);
}
protected override void Paint(Graphics g,Rectangle bounds,CurrencyManager source,int rowNum,bool alignToRight)
{
//MessageBox.Show("P2");
Paint(
g,bounds,
source,
rowNum,
Brushes.Red,
Brushes.Blue,
alignToRight);
}
protected override void Paint(Graphics g,Rectangle bounds,CurrencyManager source,int rowNum,Brush backBrush,
Brush foreBrush,bool alignToRight)
{
int t=(int)MyCombo.SelectedValue;

string MyString;
MyCombo.SelectedValue=(int)GetColumnValueAtRow(source, rowNum);
MyString=MyCombo.Text;


Rectangle rect = bounds;
g.FillRectangle(backBrush,rect);
rect.Offset(0, 0);
rect.Height -= 0;
g.DrawString(MyString,
this.DataGridTableStyle.DataGrid.Font,
foreBrush, rect);
MyCombo.SelectedValue=t;
}
protected override void SetDataGridInColumn(DataGrid value)
{


base.SetDataGridInColumn(value);
if (MyCombo.Parent != null)
{
MyCombo.Parent.Controls.Remove
(MyCombo);
}
if (value != null)
{
value.Controls.Add(MyCombo);
}
MyCombo.Visible=false;
}
private void MyCombo_SelectedIndexChanged(object sender,System.EventArgs e)
{

this.isEditing=true;
base.ColumnStartedEditing(MyCombo);
}

}
}

при редактировании существующих записей - все ОК, при добавлении новой - происходит исключение что делаю не так
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32838669
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какое исклюение (текст) и где происходит ???
----
PS: "Specified cast is not valid." в строке:
int value =(int)GetColumnValueAtRow(source, rowNum);
???
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32838683
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, именно Specified cast is not valid." в строке:
int value =(int)GetColumnValueAtRow(source, rowNum);
извините, что сразу не сказал
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32838702
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 варианта решения:

сделай default value у этого поля, например, равным 0 (чтобы был integer) иначе DBNull -> int - это и есть ошибка при приведении типов

или


замени int value =(int)GetColumnValueAtRow(source, rowNum);
на object value =GetColumnValueAtRow(source, rowNum);
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32838723
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поменял
int value =(int)GetColumnValueAtRow(source, rowNum);
на object value =GetColumnValueAtRow(source, rowNum);
та же фигня:
An unhandled exception of type 'System.InvalidCastException' occurred in testGrid.exe

Additional information: Specified cast is not valid.

больше скажу, если я оставляю метод Edit пустым, исключение всеравно происходит( 'System.InvalidCastException' )тольок уже здесь
static void Main()
{
Application.Run(new Form1());
}
(это в классе формы, где объявляется clmnComboBox
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32838742
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в ComboBox есть элемент типа:

для ValueMember - DBNull.Value;
и DisplayMember - "(не определено)";
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32838748
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы наверное не поняли...
если в методе Edit с ComboBox ВОБЩЕ ничего не делать, и вообще ничего не делать, всеравно происходит исключение... :(
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32838793
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обрати теперь внимание на строку:
Код: plaintext
MyCombo.SelectedValue=(int)GetColumnValueAtRow(source, rowNum);
в protected override void Paint(..);
это таже самая история для DBNull
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32838867
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага...
туплю, наверное, сейсас попробую, спасибо
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32838993
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все получилось!
если интересно то вот, переделал методы Edit и Paint:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
protected override void Edit(CurrencyManager source,int rowNum,Rectangle bounds,bool readOnly,string instantText,bool cellIsVisible) 
{
	//MessageBox.Show(rowNum.ToString());
	object MyValue=GetColumnValueAtRow(source, rowNum);
	if (cellIsVisible) 
	{
		MyCombo.Bounds = new Rectangle
			(bounds.X , bounds.Y , 
			bounds.Width, bounds.Height );
		if (System.Convert.IsDBNull(MyValue)==false)
		{
			MyCombo.SelectedValue=MyValue;
		}
		else
		{
			MyCombo.SelectedIndex=0;
		}
		MyCombo.SelectedValueChanged += 
			new EventHandler(MyCombo_SelectedIndexChanged);
		MyCombo.Visible = true;
	} 
	else 
	{
		if (System.Convert.IsDBNull(MyValue)==false)
		{
			MyCombo.SelectedValue=MyValue;
		}
		else
		{
			MyCombo.SelectedIndex=0;
		}
		MyCombo.Visible = false;
	}
	if (MyCombo.Visible)
		DataGridTableStyle.DataGrid.Invalidate(bounds);
}

protected override void Paint(Graphics g,Rectangle bounds,CurrencyManager source,int rowNum,Brush backBrush, 
	Brush foreBrush,bool alignToRight) 
{
	int t=(int)MyCombo.SelectedValue;
	object MyValue=GetColumnValueAtRow(source, rowNum);
	string MyString;
	if (System.Convert.IsDBNull(MyValue)==false)
	{
		MyCombo.SelectedValue=MyValue;
	}
	else
	{
		MyCombo.SelectedIndex=0;
	}
	MyString=MyCombo.Text;

	Rectangle rect = bounds;
	g.FillRectangle(backBrush,rect);
	rect.Offset(0, 0);
	rect.Height -= 0;
	g.DrawString(MyString, 
		this.DataGridTableStyle.DataGrid.Font, 
		foreBrush, rect);
	MyCombo.SelectedValue=t;
}
2 кузя: СПАСИБО!!!
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32839103
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как тебе удалось отредактировать своё последнее сообщение ???
только что было без форматирования (как и первый пост) - и вдруг ...
мистика, блин.
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32839165
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не форматировал....
сам удивляюсь
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32839196
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это всё твой ник виноват - прям по мозгам WHISKY !
...
Рейтинг: 0 / 0
ComboBox в DataGrid (WinForms)
    #32839316
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:) ну не совсем виски все же
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ComboBox в DataGrid (WinForms)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]