DataGridView问题

破碎的脸 2009-09-30 07:28:13
有一个DataTable,其中不知道哪几列的数据全是List<T>,就先当它是List<string>吧,请问一下,怎么样让DataGridView绑定到这个DataTable时,用Combobox来显示这几列的数据?
...全文
444 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
guohouchang 2009-10-02
  • 打赏
  • 举报
回复
关注~
yekanet 2009-10-02
  • 打赏
  • 举报
回复
添加DataGridViewComboBoxColumn
namhyuk 2009-10-02
  • 打赏
  • 举报
回复
就比如Northwind的Products表吧。它存的不是CategoryID吗?那就让这个字段用ComboBox来显示实际的CateogoryName.

基本上不写代码的一种方式是[数据]-[显示数据源]-[添加数据源],1、定位到Northwind的Products表,为简单起见,只选择ProductID, ProductName及CategoryID. 2、定位到Categories表,选择CategoryID, CategoryName.

然后把Products从[数据源]面板直接拖到Form上, 生成productsBindingSource, productsBindingNavigator等。

DataGridView的SmartTag上选择编辑列,把CategoryID列改成DataGridViewComobBoxColumn, DataSource选择[其他数据源]-[项目数据源]-[NorthwindDataSet]-[Categories]表。DisplayMember:CategoryName, ValueMember=CategoryID, DataPropertyName:CategoryID.

OK! done.

破碎的脸 2009-10-02
  • 打赏
  • 举报
回复
不会没有解决办法吧?大家再想想。。
24K純帥 2009-10-02
  • 打赏
  • 举报
回复
学习。。
破碎的脸 2009-10-02
  • 打赏
  • 举报
回复
借wuyq11的代码,更改如下,跟大家一起分享,可以实现更强大的功能:
public partial class Form3 : Form
{
// 定义下拉列表框
private ComboBox cmb_Temp = new ComboBox();

public Form3()
{
InitializeComponent();
}

/// <summary>
/// 绑定性别下拉列表框
/// </summary>
private void BindSex()
{
//DataTable dtSex = new DataTable();
//dtSex.Columns.Add("Value");
//dtSex.Columns.Add("Name");
//DataRow drSex;
//drSex = dtSex.NewRow();
//drSex[0] = "1";
//drSex[1] = "男";
//dtSex.Rows.Add(drSex);
//drSex = dtSex.NewRow();
//drSex[0] = "0";
//drSex[1] = "女";
//dtSex.Rows.Add(drSex);
//cmb_Temp.ValueMember = "Value";
//cmb_Temp.DisplayMember = "Name";
//cmb_Temp.DataSource = dtSex;
cmb_Temp.DropDownStyle = ComboBoxStyle.DropDownList;
}

/// <summary>
/// 为避免连接数据库,这里手工构造数据表,实际应用中应从数据库中获取
/// </summary>
private void BindData()
{
DataTable dtData = new DataTable();
dtData.Columns.Add("ID");
dtData.Columns.Add("Name");
dtData.Columns.Add("Sex", typeof(ok));
DataRow drData;
drData = dtData.NewRow();
drData[0] = 1;
drData[1] = "张三";
drData[2] = getList();
dtData.Rows.Add(drData);
drData = dtData.NewRow();
drData[0] = 2;
drData[1] = "李四";
drData[2] = getList();
dtData.Rows.Add(drData);
drData = dtData.NewRow();
drData[0] = 3;
drData[1] = "王五";
drData[2] = getList();
dtData.Rows.Add(drData);
drData = dtData.NewRow();
drData[0] = 4;
drData[1] = "小芳";
drData[2] = getList();
dtData.Rows.Add(drData);
drData = dtData.NewRow();
drData[0] = 5;
drData[1] = "小娟";
drData[2] = getList();
dtData.Rows.Add(drData);
drData = dtData.NewRow();
drData[0] = 6;
drData[1] = "赵六";
drData[2] = getList();
dtData.Rows.Add(drData);
this.dgv_User.CurrentCellChanged+=new EventHandler(dgv_User_CurrentCellChanged);
this.dgv_User.DataBindingComplete+=new DataGridViewBindingCompleteEventHandler(dgv_User_DataBindingComplete);
this.dgv_User.DataSource = dtData;
}

private ok getList()
{
ok rt = new ok();
return rt;
}


private class ok
{
private List<ook> rt;

public List<ook> Rt
{
get
{
if (rt == null)
{
rt = new List<ook>();
for (int i = 0; i < 3; i++)
{
ook o = new ook();
o.S = i.ToString() ;
o.V = Guid.NewGuid().ToString();
rt.Add(o);
}
}
return rt;
}
set { rt = value; }
}

private string aaa="AAA";

public string Aaa
{
get { return aaa; }
set { aaa = value; }
}

public override string ToString()
{
return Aaa;
}
}

private class ook
{
private string s;

public string S
{
get { return s; }
set { s = value; }
}

private string v;

public string V
{
get { return v; }
set { v = value; }
}
}

private void MainForm_Load(object sender, EventArgs e)
{
// 绑定性别下拉列表框
BindSex();

//绑定数据表
BindData();

// 设置下拉列表框不可见
cmb_Temp.Visible = false;

// 添加下拉列表框事件
cmb_Temp.SelectedIndexChanged += new EventHandler(cmb_Temp_SelectedIndexChanged);

// 将下拉列表框加入到DataGridView控件中
this.dgv_User.Controls.Add(cmb_Temp);
}

// 当用户移动到性别这一列时单元格显示下拉列表框
private void dgv_User_CurrentCellChanged(object sender, EventArgs e)
{
try
{
if (this.dgv_User.CurrentCell.ColumnIndex == 2)
{
Rectangle rect = dgv_User.GetCellDisplayRectangle(dgv_User.CurrentCell.ColumnIndex, dgv_User.CurrentCell.RowIndex, false);
//string sexValue = dgv_User.CurrentCell.Value.ToString();
//if (sexValue == "1")
//{
// cmb_Temp.Text = "男";
//}
//else
//{
// cmb_Temp.Text = "女";
//}
cmb_Temp.Items.Clear();
ok ht = dgv_User.CurrentCell.Tag as ok;
List<ook> o = ht.Rt;
foreach (var v in o)
{
cmb_Temp.Items.Add(v.S);
}

cmb_Temp.Left = rect.Left;
cmb_Temp.Top = rect.Top;
cmb_Temp.Width = rect.Width;
cmb_Temp.Height = rect.Height;
cmb_Temp.Visible = true;
}
else
{
cmb_Temp.Visible = false;
}
}
catch
{
}
}

// 当用户选择下拉列表框时改变DataGridView单元格的内容
private void cmb_Temp_SelectedIndexChanged(object sender, EventArgs e)
{
//if (((ComboBox)sender).Text == "男")
//{
// dgv_User.CurrentCell.Value = "男";
// dgv_User.CurrentCell.Tag = "1";
//}
//else
//{
// dgv_User.CurrentCell.Value = "女";
// dgv_User.CurrentCell.Tag = "0";
//}

ok o= dgv_User.CurrentCell.Value as ok;
o.Aaa=o.Rt[int.Parse(((ComboBox)sender).Text)].V;

}

// 滚动DataGridView时将下拉列表框设为不可见
private void dgv_User_Scroll(object sender, ScrollEventArgs e)
{
this.cmb_Temp.Visible = false;
}

// 改变DataGridView列宽时将下拉列表框设为不可见
private void dgv_User_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
{
this.cmb_Temp.Visible = false;
}

// 绑定数据表后将性别列中的每一单元格的Value和Tag属性(Tag为值文本,Value为显示文本)
private void dgv_User_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
for (int i = 0; i < this.dgv_User.Rows.Count; i++)
{
if (dgv_User.Rows[i].Cells[2].Value != null && dgv_User.Rows[i].Cells[2].ColumnIndex == 2)
{
dgv_User.Rows[i].Cells[2].Tag = dgv_User.Rows[i].Cells[2].Value;
//if (dgv_User.Rows[i].Cells[2].Value.ToString() == "1")
//{
// dgv_User.Rows[i].Cells[2].Value = "男";
//}
//else if (dgv_User.Rows[i].Cells[2].Value.ToString() == "0")
//{
// dgv_User.Rows[i].Cells[2].Value = "女";
//}
}
}
}
}
破碎的脸 2009-10-02
  • 打赏
  • 举报
回复
OK,解决,感谢 wuyq11
wuyq11 2009-10-01
  • 打赏
  • 举报
回复
在DataGridView中嵌入combobox
参考
无天 2009-10-01
  • 打赏
  • 举报
回复
哦?。。。
qldsrx 2009-09-30
  • 打赏
  • 举报
回复
1楼似乎是从别处复制的代码,还写着日期“2008-08-06 15:15”

楼主这个问题不能实现,因为DataGridView的每个cell不能单独设置为Combobox,所谓的Combobox列是用来编辑的,也就是整列都是相同的数据源提供给Combobox,编辑状态显示为Combobox,正常状态显示为字符串,无法在非编辑状态将一个cell设置为编辑控件用来显示。
破碎的脸 2009-09-30
  • 打赏
  • 举报
回复
DataTable结构不固定,大致是。。。

姓名 工资 照片(这个照片是多张的,List<Image>,可以选,那么当使用GridView绑定到时,如何让它把这一列的List<Image>-----显示图片的问题先不考虑-----,逐一绑定上去呢?每行的List<Image>都不一样哦)
破碎的脸 2009-09-30
  • 打赏
  • 举报
回复
楼上的方法好像没看懂。。。。
不是要重写DataGridViewComboboxColumn这些吗?那个只能加入一个控件吧?
CurrentCellChanged
没找到,我写的是Winforms
杨哥儿 2009-09-30
  • 打赏
  • 举报
回复
2008-08-06 15:15第一:
先在窗体设计时拖一个ComBoBox控件,然后在里面的ITEMS设好你要下拉项.

第二:
在窗体的Load方法中加入:g_DataGridView.Controls.Add(g_ComBoBox);也就是把ComBoBox控件添加到DataGridView控件中

第三:
在DataGridView控件的CurrentCellChanged方法中写如下代码:

DataGridViewCell CurrnetCell = g_View.CurrentCell;
if (CurrnetCell != null && CurrnetCell.OwningColumn.Name == "列名")
{
Rectangle TmpRect = g_DataGridView.GetCellDisplayRectangle(CurrnetCell.ColumnIndex, CurrnetCell.RowIndex, true);
g_ComBoBox.Text = CurrnetCell.Value.ToString();
g_ComBoBox.Size = TmpRect.Size;
g_ComBoBox.Top = TmpRect.Top;
g_ComBoBox.Left = TmpRect.Left;
g_ComBoBox.Visible = true;
}
else
{
g_ComBoBox.Visible = false;
}
最后在ComBoBox控件的SelectedIndexChanged方法中写:

g_DataGridView.CurrentCell.Value = g_ComBoBox.Text;

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧