PDA

View Full Version : حرفه ای: لطفا کمک کنید ! کار با کامپوننت datagridview



Amir.pc_66
سه شنبه 04 بهمن 1390, 19:03 عصر
آقا تو رو خدا هرکی بلده کمک کنه !
مشکل اینه که میخوام یکی از ستونای Datagridview رو Combobox بذارم ولی مشکل به این راحتی حل نمیشه - مشکل اصلی اینه که میخوام اون Combobox تو خصوصیت Dropdownstyle اش مقدار Dropdown رو داشته باشه نه خاصیت Dropdownlist

به عبارت ساده تر خاصیت نوشتاری بودن Combobox رو هم میخوام نه فقط خاصیت انتخابی

به عبارت ساده ترترتر مثل Search Google

Datasource کامبوباکس رو خودم میدم


سوال دیگه اینکه با چه دستوری میتونم به هریک از سلولهای Datagridview دسترسی داشته باشم؟

ممنون از دوستایی که کمک می کنن

AliSaeedi_v
سه شنبه 04 بهمن 1390, 19:10 عصر
سلام سوال اولت که وقتی از کامبو باکس استفاده میکنی باید بگی selected text
سوال دوم

datagrid[شماره ستون,شماره سطر].value

Hybrid
سه شنبه 04 بهمن 1390, 19:47 عصر
دوست عزیز اصلا سوال اولت واضح نیست ، ولی اگه خوب فهمیده باشم باید از خاصیت AutoCompleteSource کامبو استفاده کنین...

موفق باشید./

Amir.pc_66
چهارشنبه 05 بهمن 1390, 09:17 صبح
ممنون از دوستان که جواب دادین ولی فکر کنم سوالو خوب توضیح ندادم.
سوال اینه
وقتی ما یک کامبوباکس استفاده میکنیم یه خاصیت داره به نام Dropdownstyle که اگه روی Dropdown بذاریم میتونیم داخلش یه چیزهایی هم خودمون بنویسیم ولی اگر روی Dropdownlist بذاریم دیگه خاصیت نوشتاری برامون نداره فقط میتونیم از بین آیتمهاش انتخاب کنیم
همین
حالا اگه ما یه ستون از Datagrid رو به عنوان کامبوباکس در نظر بگیریم این خاصیت رو کامبو نداره

هدف از این سوال هم اینه که کاربر بتونه اطلاعات Datagrid رو بصورت دستی وارد کنه ولی Datasource کامبو رو از پایگاه داده بیاره با این عمل اضافی که هر چی تو کامبو مینویسه بعنوان یک Text تو Datasource خود کامبو جستجو بشه

امیدوارم سوال کاملا مفهوم باشه

ali_habibi1384
چهارشنبه 05 بهمن 1390, 10:54 صبح
يك راهش اينه كه اطلاعات داخل گريد رو با حلقه For بريزي توي كوبو(ADD) .خاصيت Sort رو هم True بذاري.تا اطلاعات رو مرتب شده بياره.



int cntAnbar = dgv.Rows.Count;
for (int i = 0; i < cntAnbar; i++)
{
cmbCodeAnbar.Items.Add(dgv["Column", i].Value.ToString());
}

modern_amin
چهارشنبه 05 بهمن 1390, 12:34 عصر
اینو ببین
http://barnamenevis.org/showthread.php?245726-مطالبی-کمیاب-در-مورد-Data-Grid-View&highlight=%

Amir.pc_66
چهارشنبه 05 بهمن 1390, 12:42 عصر
بازم سوال منو متوجه نشدین!

سوال اینه ! چطوری میشه یه ستون از Datagridview رو به عنوان کامبو تعریف کرد به شرطی که بشه توی Combobox یه چیزی نوشت نه اینکه فقط ازش انتخاب کرد

دوستان لطفا تست کنن بعد جواب بدن!

هرکی بتونه جوابی بده هر سوالی داشته باشه جواب میدم!

amir3321
چهارشنبه 05 بهمن 1390, 14:32 عصر
بصورت default این عمل امکان ندارد ولی می تونی از کد زیر استفاده کنی این هم لینک (http://social.msdn.microsoft.com/Forums/ar/winformsdatacontrols/thread/7446207a-34bb-4d85-8a5f-d6b04fef9597) منبعش

' create combocolum...
Dim
combocolum As New DataGridViewComboBoxColumn
combocolum.DefaultCellStyle.Tag = "editable" ' this is the enhance to control if editable or not
combocolum.HeaderText = "Status"
combocolum.DataPropertyName = "Status"
combocolum.Items.Add("SOLD OUT")
combocolum.Items.Add("CHEAP IN")
combocolum.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
DataGridView1.Columns.Add(combocolum)

' ---------------- copy / paste -----------
Enum CBO_MODE
NORMAL = 0
EDITABLE = 1
EDITABLE_WITH_NOTIFYCURRENTCELLDIRTY = 2
End Enum Const ALLOW_ADDS As Boolean = True
Private MODE As CBO_MODE = CBO_MODE.EDITABLE_WITH_NOTIFYCURRENTCELLDIRTY
Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
' Here you control if combobox will be editable or not
If e.CellStyle.Tag = "editable" Then
Dim dataGridView1 As DataGridView = CType(sender, DataGridView)
If (TypeOf (e.Control) Is ComboBox) Then
Dim cb As ComboBox = CType(e.Control, ComboBox)
If (Not cb Is Nothing) Then
cb.DropDownStyle = ComboBoxStyle.DropDown
If (MODE = CBO_MODE.EDITABLE_WITH_NOTIFYCURRENTCELLDIRTY) Then
' Added thanks to Ying Liu, Microsoft Support
dataGridView1.NotifyCurrentCellDirty(True)
End If
End If
End If
End If
End Sub

Private Sub dataGridView1_CellValidating(ByVal sender As Object, ByVal e As DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
Dim dataGridView1 As DataGridView = CType(sender, DataGridView)
If (TypeOf dataGridView1.Columns(e.ColumnIndex) Is DataGridViewComboBoxColumn) Then
Dim comboBoxColumn As DataGridViewComboBoxColumn = dataGridView1.Columns(e.ColumnIndex)
If (Not comboBoxColumn.Items.Contains(e.FormattedValue)) Then
If (ALLOW_ADDS) Then
Beep() ' Audio confirmation that the item has been added (optional)
comboBoxColumn.Items.Add(e.FormattedValue)
Else
' How do we cancel?
e.Cancel = True
End If
End If
End If
End Sub

amir3321
چهارشنبه 05 بهمن 1390, 14:45 عصر
این هم یک نمونه کد سی شارپ که از تو اینترنت پیدا کردم تست کردم جواب داد ه


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
DataGridViewComboBoxColumn comboColumn;

DataTable dt;

DataTable dt2;
private void Form3_Load(object sender, EventArgs e)
{






dt = new DataTable();

dt.Columns.Add("comboColumn");

dt.Columns.Add("col");

dt.Rows.Add("id1", "abc");

dt.Rows.Add("id2", "def");



dt2 = new DataTable();

dt2.Columns.Add("comboCol");

dt2.Rows.Add("id1");

dt2.Rows.Add("id2");



dataGridView1.AutoGenerateColumns = false;

comboColumn = new DataGridViewComboBoxColumn();

comboColumn.DataPropertyName = "comboColumn";

comboColumn.DisplayMember = "comboCol";

comboColumn.ValueMember = "comboCol";

comboColumn.DataSource = dt2;





DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();

textColumn.DataPropertyName = "col";

dataGridView1.Columns.Add(comboColumn);

dataGridView1.Columns.Add(textColumn);

dataGridView1.DataSource = dt;



dataGridView1.CellValidating += new DataGridViewCellValidatingEventHandler(dataGridVie w1_CellValidating);

dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(data GridView1_EditingControlShowing);

}



void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{

if (this.dataGridView1.CurrentCellAddress.X == comboColumn.DisplayIndex)
{

ComboBox cb = e.Control as ComboBox;

if (cb != null)
{

cb.DropDownStyle = ComboBoxStyle.DropDown;

}

}

}



void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)

{

if (e.ColumnIndex == comboColumn.DisplayIndex)

{

if (!dataCheck(e.FormattedValue.ToString(), dt2, 0))

{

dt2.Rows.Add(e.FormattedValue);

comboColumn.DataSource = dt2;

dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue;

}

}

}



private bool dataCheck(string value, DataTable datatable, int columnIndex)

{

bool result = false;

if (datatable != null)

{

for (int i = 0; i < datatable.Rows.Count; i++)

{

if (datatable.Rows[i].ItemArray.GetValue(columnIndex).ToString() == value)

{

result = true;

break;

}

}

}

return result;

}






}

}

Amir.pc_66
پنج شنبه 06 بهمن 1390, 01:11 صبح
بصورت default این عمل امکان ندارد ولی می تونی از کد زیر استفاده کنی این هم لینک (http://social.msdn.microsoft.com/Forums/ar/winformsdatacontrols/thread/7446207a-34bb-4d85-8a5f-d6b04fef9597) منبعش

' create combocolum...
Dim
combocolum As New DataGridViewComboBoxColumn
combocolum.DefaultCellStyle.Tag = "editable" ' this is the enhance to control if editable or not
combocolum.HeaderText = "Status"
combocolum.DataPropertyName = "Status"
combocolum.Items.Add("SOLD OUT")
combocolum.Items.Add("CHEAP IN")
combocolum.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
DataGridView1.Columns.Add(combocolum)

' ---------------- copy / paste -----------
Enum CBO_MODE
NORMAL = 0
EDITABLE = 1
EDITABLE_WITH_NOTIFYCURRENTCELLDIRTY = 2
End Enum Const ALLOW_ADDS As Boolean = True
Private MODE As CBO_MODE = CBO_MODE.EDITABLE_WITH_NOTIFYCURRENTCELLDIRTY
Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
' Here you control if combobox will be editable or not
If e.CellStyle.Tag = "editable" Then
Dim dataGridView1 As DataGridView = CType(sender, DataGridView)
If (TypeOf (e.Control) Is ComboBox) Then
Dim cb As ComboBox = CType(e.Control, ComboBox)
If (Not cb Is Nothing) Then
cb.DropDownStyle = ComboBoxStyle.DropDown
If (MODE = CBO_MODE.EDITABLE_WITH_NOTIFYCURRENTCELLDIRTY) Then
' Added thanks to Ying Liu, Microsoft Support
dataGridView1.NotifyCurrentCellDirty(True)
End If
End If
End If
End If
End Sub

Private Sub dataGridView1_CellValidating(ByVal sender As Object, ByVal e As DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
Dim dataGridView1 As DataGridView = CType(sender, DataGridView)
If (TypeOf dataGridView1.Columns(e.ColumnIndex) Is DataGridViewComboBoxColumn) Then
Dim comboBoxColumn As DataGridViewComboBoxColumn = dataGridView1.Columns(e.ColumnIndex)
If (Not comboBoxColumn.Items.Contains(e.FormattedValue)) Then
If (ALLOW_ADDS) Then
Beep() ' Audio confirmation that the item has been added (optional)
comboBoxColumn.Items.Add(e.FormattedValue)
Else
' How do we cancel?
e.Cancel = True
End If
End If
End If
End Sub



این اشتباهه !

Amir.pc_66
پنج شنبه 06 بهمن 1390, 01:14 صبح
این هم یک نمونه کد سی شارپ که از تو اینترنت پیدا کردم تست کردم جواب داد ه


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
DataGridViewComboBoxColumn comboColumn;

DataTable dt;

DataTable dt2;
private void Form3_Load(object sender, EventArgs e)
{






dt = new DataTable();

dt.Columns.Add("comboColumn");

dt.Columns.Add("col");

dt.Rows.Add("id1", "abc");

dt.Rows.Add("id2", "def");



dt2 = new DataTable();

dt2.Columns.Add("comboCol");

dt2.Rows.Add("id1");

dt2.Rows.Add("id2");



dataGridView1.AutoGenerateColumns = false;

comboColumn = new DataGridViewComboBoxColumn();

comboColumn.DataPropertyName = "comboColumn";

comboColumn.DisplayMember = "comboCol";

comboColumn.ValueMember = "comboCol";

comboColumn.DataSource = dt2;





DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();

textColumn.DataPropertyName = "col";

dataGridView1.Columns.Add(comboColumn);

dataGridView1.Columns.Add(textColumn);

dataGridView1.DataSource = dt;



dataGridView1.CellValidating += new DataGridViewCellValidatingEventHandler(dataGridVie w1_CellValidating);

dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(data GridView1_EditingControlShowing);

}



void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{

if (this.dataGridView1.CurrentCellAddress.X == comboColumn.DisplayIndex)
{

ComboBox cb = e.Control as ComboBox;

if (cb != null)
{

cb.DropDownStyle = ComboBoxStyle.DropDown;

}

}

}



void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)

{

if (e.ColumnIndex == comboColumn.DisplayIndex)

{

if (!dataCheck(e.FormattedValue.ToString(), dt2, 0))

{

dt2.Rows.Add(e.FormattedValue);

comboColumn.DataSource = dt2;

dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue;

}

}

}



private bool dataCheck(string value, DataTable datatable, int columnIndex)

{

bool result = false;

if (datatable != null)

{

for (int i = 0; i < datatable.Rows.Count; i++)

{

if (datatable.Rows[i].ItemArray.GetValue(columnIndex).ToString() == value)

{

result = true;

break;

}

}

}

return result;

}






}

}




ولی این یکی درسته مرسی از لطفتون که کمک کردین
البته فقط اینجاش کافیه

void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) {

if (this.dataGridView1.CurrentCellAddress.X == comboColumn.DisplayIndex)
{

ComboBox cb = e.Control as ComboBox;

if (cb != null)
{

cb.DropDownStyle = ComboBoxStyle.DropDown;

}

}

}



البته بهتر از اون هم اینجوری


private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control.GetType() == typeof(DataGridViewComboBoxEditingControl))
{

DataGridViewComboBoxEditingControl combo = e.Control as DataGridViewComboBoxEditingControl;
combo.DropDownStyle = ComboBoxStyle.DropDown;
}
}




بازم ازتون ممنونم

mohsenyazarloo
پنج شنبه 06 بهمن 1390, 10:55 صبح
برای بدست آوردن یک سلول خاص
DataGridView1.CurrentRow.Cells[Columnname Or Index].value.tostring()

Amir.pc_66
پنج شنبه 06 بهمن 1390, 13:20 عصر
برای بدست آوردن یک سلول خاص
DataGridView1.CurrentRow.Cells[Columnname Or Index].value.tostring()


دوست عزیز این دستور واسه سطری هستش که توسط کاربر انتخاب شده باشه

ولی واسه دسترسی به یه سلول خاص همون دستوری است که اول پستها بهش اشاره شد