winform datagridview一列中如何实现既有按钮又有文本输入 winform datagridview一列中如何实现既有按钮又有文本输入像这种效果的,按钮实现点击。弹出查询表 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自带的VS中Datagridview好像是不可以实现的吧,那个是重绘了该控件吧,例如国外有个叫Table的控件 微软件只到的DataGridView列的类型模板当中是没有这种类型的列模板的,这个要靠自己实现一个DataGridViewColumn的类,添加单元格右边按键部分的功能class MyDataGridViewColumn : DataGridViewColumn{//楼主需要完成下面两个方面功能://重绘时画出按钮的区域及三个点//点击的时候加入对方框弹出}使用的时候private void InitialGrid(){DataGridView dgv = new DataGridView();DataGridViewColumn col = new MyDataGridView();dgv.Columns.Add(col);}只是提供一个思路,楼主如有兴趣可以自己去完善.. GridView列不是可以有模板的吗?自己写个用户控件,把用户控件加进去不行吗? #region 显示按钮 string ShowButtonColumnName = ""; private void dgvMaterielDetail_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (dgvMaterielDetail.CurrentCell != null) //&& dgvMaterielDetail.CurrentCell.ColumnIndex == 8 { //增加文本框后面显示小按钮 Control[] CS = this.dgvMaterielDetail.EditingPanel.Controls.Find("_TextBoxCellButton_", true); if (CS.Length > 0) { this.dgvMaterielDetail.EditingPanel.Controls.Remove(CS[0]); } if (ShowButtonColumnName != "") { string[] ShowButton = ShowButtonColumnName.ToString().Split(','); for (int i = 0; i < ShowButton.Length; i++) { if (ShowButton[i].ToLower() == this.dgvMaterielDetail.CurrentCell.OwningColumn.Name.ToLower()) { MES.FormBase.UButton button = new MES.FormBase.UButton(); button.Name = "_TextBoxCellButton_"; button.Text = ""; button.Width = 16; button.Height = 40; button.BackColor = System.Drawing.Color.Black; button.Parent = this.dgvMaterielDetail.EditingPanel; button.Dock = DockStyle.Right; e.Control.Dock = DockStyle.Fill; button.Click += new EventHandler(TextBoxCellButtonClick_Click); } } } } } #endregion #region 选择主副物料 public virtual void TextBoxCellButtonClick_Click(object sender, EventArgs e) { if (dgvMaterielDetail.Rows.Count == 0) return; if (dgvMaterielDetail.CurrentRow == null) return; SelectItem fs; //主料 if (dgvMaterielDetail.CurrentCell.ColumnIndex == dgvMaterielDetail.Columns["MAINMATERIELNO"].Index) { fs = new SelectItem(); fs.strChkFlag = "1"; fs.TabItem.Rows.Clear(); if (fs.ShowDialog(this) == DialogResult.OK) { if (fs.TabItem.Rows.Count == 0) return; dgvMaterielDetail.Rows[dgvMaterielDetail.CurrentRow.Index].Cells["MAINMATERIELNO"].Value = fs.TabItem.Rows[0][0].ToString(); dgvMaterielDetail.Rows[dgvMaterielDetail.CurrentRow.Index].Cells["MATERIELSPECIAL"].Value = fs.TabItem.Rows[0][2].ToString(); } } //副料1 if (dgvMaterielDetail.CurrentCell.ColumnIndex == dgvMaterielDetail.Columns["SECONDMATERIELNO1"].Index) { fs = new SelectItem(); fs.strChkFlag = "1"; fs.TabItem.Rows.Clear(); if (fs.ShowDialog(this) == DialogResult.OK) { if (fs.TabItem.Rows.Count == 0) return; dgvMaterielDetail.Rows[dgvMaterielDetail.CurrentRow.Index].Cells["SECONDMATERIELNO1"].Value = fs.TabItem.Rows[0][0].ToString(); } } //副料2 if (dgvMaterielDetail.CurrentCell.ColumnIndex == dgvMaterielDetail.Columns["SECONDMATERIELNO2"].Index) { fs = new SelectItem(); fs.strChkFlag = "1"; fs.TabItem.Rows.Clear(); if (fs.ShowDialog(this) == DialogResult.OK) { if (fs.TabItem.Rows.Count == 0) return; dgvMaterielDetail.Rows[dgvMaterielDetail.CurrentRow.Index].Cells["SECONDMATERIELNO2"].Value = fs.TabItem.Rows[0][0].ToString(); } } //副料3 if (dgvMaterielDetail.CurrentCell.ColumnIndex == dgvMaterielDetail.Columns["SECONDMATERIELNO3"].Index) { fs = new SelectItem(); fs.strChkFlag = "1"; fs.TabItem.Rows.Clear(); if (fs.ShowDialog(this) == DialogResult.OK) { if (fs.TabItem.Rows.Count == 0) return; dgvMaterielDetail.Rows[dgvMaterielDetail.CurrentRow.Index].Cells["SECONDMATERIELNO3"].Value = fs.TabItem.Rows[0][0].ToString(); } } dgvMaterielDetail.CurrentRow.Cells[dgvMaterielDetail.CurrentCell.ColumnIndex - 1].Selected = true; dgvMaterielDetail.CurrentRow.Cells[dgvMaterielDetail.CurrentCell.ColumnIndex + 1].Selected = true; } #endregion C# 打开未知文件时,如何做出判断。。。。。 字符串截取 如何判断 TcpClient 连接是否正常,是否可写数据至 NetworkStream? dataGrid 的问题 可空类型的使用问题 C# EmguCV(OpenCV) 中ImageBox自带鼠标操作功能可否去掉 求2个与日期时间和字符串的正则表达式! 帮助文件 一个对我来说有点难的问题,请大家指点迷津,100分献上 c#一个服务器接收多个客户端的图片信息 连接一个客户端时可以正常接收图片,但是连接2个以上的客户端就报错 C# contextMenuStrip1 鼠标经过的一级菜单更改颜色,如何实现? 急急急、、各大高手拜托老哈、、
class MyDataGridViewColumn : DataGridViewColumn
{
//楼主需要完成下面两个方面功能://重绘时画出按钮的区域及三个点//点击的时候加入对方框弹出
}
使用的时候private void InitialGrid()
{
DataGridView dgv = new DataGridView();
DataGridViewColumn col = new MyDataGridView();
dgv.Columns.Add(col);}只是提供一个思路,楼主如有兴趣可以自己去完善..
string ShowButtonColumnName = "";
private void dgvMaterielDetail_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dgvMaterielDetail.CurrentCell != null) //&& dgvMaterielDetail.CurrentCell.ColumnIndex == 8
{
//增加文本框后面显示小按钮
Control[] CS = this.dgvMaterielDetail.EditingPanel.Controls.Find("_TextBoxCellButton_", true);
if (CS.Length > 0)
{
this.dgvMaterielDetail.EditingPanel.Controls.Remove(CS[0]);
}
if (ShowButtonColumnName != "")
{
string[] ShowButton = ShowButtonColumnName.ToString().Split(',');
for (int i = 0; i < ShowButton.Length; i++)
{
if (ShowButton[i].ToLower() == this.dgvMaterielDetail.CurrentCell.OwningColumn.Name.ToLower())
{
MES.FormBase.UButton button = new MES.FormBase.UButton();
button.Name = "_TextBoxCellButton_";
button.Text = "";
button.Width = 16;
button.Height = 40;
button.BackColor = System.Drawing.Color.Black;
button.Parent = this.dgvMaterielDetail.EditingPanel;
button.Dock = DockStyle.Right;
e.Control.Dock = DockStyle.Fill;
button.Click += new EventHandler(TextBoxCellButtonClick_Click);
}
}
} }
}
#endregion
public virtual void TextBoxCellButtonClick_Click(object sender, EventArgs e)
{
if (dgvMaterielDetail.Rows.Count == 0)
return;
if (dgvMaterielDetail.CurrentRow == null)
return; SelectItem fs;
//主料 if (dgvMaterielDetail.CurrentCell.ColumnIndex == dgvMaterielDetail.Columns["MAINMATERIELNO"].Index)
{
fs = new SelectItem();
fs.strChkFlag = "1";
fs.TabItem.Rows.Clear();
if (fs.ShowDialog(this) == DialogResult.OK)
{
if (fs.TabItem.Rows.Count == 0)
return;
dgvMaterielDetail.Rows[dgvMaterielDetail.CurrentRow.Index].Cells["MAINMATERIELNO"].Value = fs.TabItem.Rows[0][0].ToString();
dgvMaterielDetail.Rows[dgvMaterielDetail.CurrentRow.Index].Cells["MATERIELSPECIAL"].Value = fs.TabItem.Rows[0][2].ToString();
} } //副料1
if (dgvMaterielDetail.CurrentCell.ColumnIndex == dgvMaterielDetail.Columns["SECONDMATERIELNO1"].Index)
{
fs = new SelectItem();
fs.strChkFlag = "1";
fs.TabItem.Rows.Clear();
if (fs.ShowDialog(this) == DialogResult.OK)
{
if (fs.TabItem.Rows.Count == 0)
return;
dgvMaterielDetail.Rows[dgvMaterielDetail.CurrentRow.Index].Cells["SECONDMATERIELNO1"].Value = fs.TabItem.Rows[0][0].ToString(); } }
//副料2
if (dgvMaterielDetail.CurrentCell.ColumnIndex == dgvMaterielDetail.Columns["SECONDMATERIELNO2"].Index)
{
fs = new SelectItem();
fs.strChkFlag = "1";
fs.TabItem.Rows.Clear();
if (fs.ShowDialog(this) == DialogResult.OK)
{
if (fs.TabItem.Rows.Count == 0)
return;
dgvMaterielDetail.Rows[dgvMaterielDetail.CurrentRow.Index].Cells["SECONDMATERIELNO2"].Value = fs.TabItem.Rows[0][0].ToString();
} }
//副料3
if (dgvMaterielDetail.CurrentCell.ColumnIndex == dgvMaterielDetail.Columns["SECONDMATERIELNO3"].Index)
{
fs = new SelectItem();
fs.strChkFlag = "1";
fs.TabItem.Rows.Clear();
if (fs.ShowDialog(this) == DialogResult.OK)
{
if (fs.TabItem.Rows.Count == 0)
return;
dgvMaterielDetail.Rows[dgvMaterielDetail.CurrentRow.Index].Cells["SECONDMATERIELNO3"].Value = fs.TabItem.Rows[0][0].ToString();
} }
dgvMaterielDetail.CurrentRow.Cells[dgvMaterielDetail.CurrentCell.ColumnIndex - 1].Selected = true;
dgvMaterielDetail.CurrentRow.Cells[dgvMaterielDetail.CurrentCell.ColumnIndex + 1].Selected = true;
}
#endregion