问题1:datagrid默认是textBox控件。鼠标点在上面可以修改数据,但怎么通过一个按钮进行数据的保存呢??问题2:通过按钮读取数据后,datagrid中读取到几行就在那几行中,第一列添加combobox控件。怎么做??
解决方案 »
- datagridview怎么分页
- Win7自带的刻录功能有没有供我们外部调用的API函数?
- [分]面向对象数据中,互相关联数据的深度问题.
- C#调用C++问题,请教!
- C# Winf DataGridview 加入图片问题
- CommonTransportKeys怎么用???????
- C# 水晶报表自定义内容
- asp里的TRIM()在c#里怎么用?
- 100% 纯c# 做的进销存,欢迎测试!
- 输入法(C#):1、如何将汉字输入到焦点所在窗体 2、拼音纠错如何实现
- 大虾救我:C#调用matlab中傅里叶变换对图片处理如何操作?
- 某个表的一个字段如何自动与第二个表的中的一个字段比较,那位高手有什么方法
2.数据列名是固定的吗?如果是的话,则把第一列的类型改为复选框,其它为默认的文本框
/// <summary>
/// 定义按钮
/// </summary>
private Button btn;
/// <summary>
/// 定义bindingsource
/// </summary>
private BindingSource bds;
/// <summary>
/// 数值结构
/// </summary>
private struct ScrollSize
{
public int Height;
public int Width;
}
/// <summary>
/// 设置记录滚动条值传递
/// </summary>
private ScrollSize MyScroll = new ScrollSize();
/// <summary>
/// 定义按钮btn弹出的窗体
/// </summary>
private Form2 Frmbtn; #endregion #region "窗体事件"
public Form1()
{
btn = new Button();
InitializeComponent();
this.dataGridView1.RowTemplate.Height = 19;
this.dataGridView1.RowHeadersWidth = 15;
}
/// <summary>
/// 窗体登陆事件
/// </summary>
/// <param name="sender">Form1</param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
String strConn=@"Data Source=yblzr\Sqlexpress;Initial Catalog=test;Integrated Security=True;Pooling=False";
String strSQL = @"select * from tbl_emp";
SqlConnection Conn=new SqlConnection(strConn);
//设置按钮
//委托事件
this.btn.Click += new EventHandler(this.btn_Click);
this.dataGridView1.RowHeadersWidthChanged += new EventHandler(this.dataGridView1_RowHeadersWidthChanged);
this.dataGridView1.ColumnHeadersHeightChanged += new EventHandler(this.dataGridView1_ColumnHeadersHeightChanged);
//移除事件
//this.btn.Click -= new EventHandler(this.btn_Click);
btn.Width = 20;
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.Controls.Add (btn);
btn.Visible = false; DataSet ds = new DataSet();
try
{
SqlDataAdapter da = new SqlDataAdapter(strSQL, Conn);
da.Fill(ds, "tbl_emp");
//设置ID为唯一
//ds.Tables["tbl_emp"].Columns["ID"].Unique = true;
}
catch(Exception ex)
{
MessageBox.Show(this, ex.Message);
}
//设置bindingsource
this.bds = new BindingSource();
this.bds.DataSource = ds;
this.bds.DataMember = "tbl_emp";
this.dataGridView1.ReadOnly = true;
this.dataGridView1.DataSource = bds;
//设置列不能排序
for (int i = 0; i < this.dataGridView1.Columns.Count; i++)
this.dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
}
#endregion #region "设置按钮btn位置事件"
/// <summary>
/// 单元格收到焦点事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
if (this.dataGridView1.RowCount == 0)
return;
int a = this.dataGridView1.DisplayedRowCount(true);
if (this.dataGridView1.CurrentRow == null)
{
btn.Visible = false;
return;
}
else
{
btn.Visible = true;
}
//判断滚动条是否存在,暂时未考虑
if (this.dataGridView1.DisplayedRowCount(false) == this.dataGridView1.RowCount)
MyScroll.Height = 0;
if (this.dataGridView1.DisplayedColumnCount(false) == this.dataGridView1.ColumnCount)
MyScroll.Width = 0;
//设置高度
//设置按钮控件的高度
btn.Height = this.dataGridView1.CurrentRow.Height;
//设置top
//计算btn的top
int Top=this.dataGridView1.ColumnHeadersHeight;
//判断列头是否显示
if (!this.dataGridView1.ColumnHeadersVisible)
{
Top = 0;
}
//判断当前行是否已经被隐藏
if (MyScroll.Height > this.dataGridView1.CurrentRow.Index)
{
btn.Visible = false;
return;
}
else
btn.Visible = true;
//循环相加各行的row的height
for (int i = MyScroll.Height; i < this.dataGridView1.CurrentRow.Index; i++)
Top += this.dataGridView1.Rows[i].Height;
btn.Top = Top;
//设置left
//计算btn.left
int Left;
if (this.dataGridView1.RowHeadersVisible)
Left = this.dataGridView1.RowHeadersWidth - btn.Width;
else
Left = -btn.Width;
//遍历判断提取display当前列前面的列宽
for (int i = 0; i <= this.dataGridView1.Columns["Name"].DisplayIndex; i++)
{
for (int j = 0; j <= this.dataGridView1.ColumnCount - 1; j++)
{
if (this.dataGridView1.Columns[j].DisplayIndex == i && this.dataGridView1.Columns[j].Visible)
{
Left += this.dataGridView1.Columns[j].Width;
break;
}
}
}
btn.Left = Left-MyScroll.Width ;
//判断btn的left是小于rowheader的右边界
if (this.dataGridView1.RowHeadersWidth > btn.Left && this.dataGridView1.RowHeadersVisible)
btn.Visible = false;
}
private void dataGridView1_Scroll(object sender, ScrollEventArgs e)
{
//0为水平滚动,1为垂直滚动
if (e.ScrollOrientation == 0)
{
MyScroll.Width = e.NewValue;
this.dataGridView1_CellEnter(null, null);
}
else
{
MyScroll.Height = e.NewValue;
this.dataGridView1_CellEnter(null, null);
}
} private void dataGridView1_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e)
{
//调用过程
this.dataGridView1_CellEnter(null,null);
} /// <summary>
/// 列宽变化事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
{
this.dataGridView1_CellEnter(null, null);
} /// <summary>
/// 行高变化事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_RowHeightChanged(object sender, DataGridViewRowEventArgs e)
{
this.dataGridView1_CellEnter(null, null);
}
/// <summary>
/// 列标题高度变化事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_ColumnHeadersHeightChanged(object sender, EventArgs e)
{
this.dataGridView1_CellEnter(null, null);
}
/// <summary>
/// 行头宽度变化事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_RowHeadersWidthChanged(object sender, EventArgs e)
{
this.dataGridView1_CellEnter(null, null);
}
/// <summary>
/// datagridview大小变化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_Resize(object sender, EventArgs e)
{
this.dataGridView1_CellEnter(null, null);
}
#endregion
而且又简单
http://blog.csdn.net/etudiant6666/archive/2011/03/05/6225890.aspx