我想在datagridview中添加一个NumericUpDown类型的列。所以我已经为它创建了自定义列类型,它工作正常,但每次都可以看到此控件。我只想在输入此列的特定单元格(NumericUpdown列)时,只有此控件显示。我想要如下面的截图所示。
任何帮助都会表示赞赏。
答案 0 :(得分:1)
这可能更像是一种解决方法,而不是解决方案,但是您可以考虑编写一个简单的自定义表单,单击单元格时直接在单元格上显示。该自定义表单将为您提供所需的numericUpDown行为,然后只要您单击DataGridView上的任何其他位置,自定义表单就会被隐藏,其值将保存到单元格中。这似乎是一种处理问题并获得相同行为的简单方法。祝你好运。
答案 1 :(得分:1)
我修改了包括MIN / MAX范围在内的Web示例。
public class NumericUpDownColumn : DataGridViewColumn
{
public NumericUpDownColumn()
: base(new NumericUpDownCell())
{
}
public override DataGridViewCell CellTemplate
{
get { return base.CellTemplate; }
set
{
if (value != null && !value.GetType().IsAssignableFrom(typeof(NumericUpDownCell)))
{
throw new InvalidCastException("Must be a NumericUpDownCell");
}
base.CellTemplate = value;
}
}
}
public class NumericUpDownCell : DataGridViewTextBoxCell
{
private readonly decimal min;
private readonly decimal max;
public NumericUpDownCell()
: base()
{
Style.Format = "F0";
}
public NumericUpDownCell(decimal min, decimal max)
: base()
{
this.min = min;
this.max = max;
Style.Format = "F0";
}
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
NumericUpDownEditingControl ctl = DataGridView.EditingControl as NumericUpDownEditingControl;
ctl.Minimum = this.min;
ctl.Maximum = this.max;
ctl.Value = Convert.ToDecimal(this.Value);
}
public override Type EditType
{
get { return typeof(NumericUpDownEditingControl); }
}
public override Type ValueType
{
get { return typeof(Decimal); }
}
public override object DefaultNewRowValue
{
get { return null; } //未編集の新規行に余計な初期値が出ないようにする
}
}
public class NumericUpDownEditingControl : NumericUpDown, IDataGridViewEditingControl
{
private DataGridView dataGridViewControl;
private bool valueIsChanged = false;
private int rowIndexNum;
public NumericUpDownEditingControl()
: base()
{
this.DecimalPlaces = 0;
}
public DataGridView EditingControlDataGridView
{
get { return dataGridViewControl; }
set { dataGridViewControl = value; }
}
public object EditingControlFormattedValue
{
get{ return this.Value.ToString("F0"); }
set{ this.Value = Decimal.Parse(value.ToString()); }
}
public int EditingControlRowIndex
{
get { return rowIndexNum; }
set { rowIndexNum = value; }
}
public bool EditingControlValueChanged
{
get { return valueIsChanged; }
set { valueIsChanged = value; }
}
public Cursor EditingPanelCursor
{
get { return base.Cursor; }
}
public bool RepositionEditingControlOnValueChange
{
get { return false; }
}
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.ForeColor = dataGridViewCellStyle.ForeColor;
this.BackColor = dataGridViewCellStyle.BackColor;
}
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
return (keyData == Keys.Left || keyData == Keys.Right ||
keyData == Keys.Up || keyData == Keys.Down ||
keyData == Keys.Home || keyData == Keys.End ||
keyData == Keys.PageDown || keyData == Keys.PageUp);
}
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return this.Value.ToString();
}
public void PrepareEditingControlForEdit(bool selectAll)
{
}
protected override void OnValueChanged(EventArgs e)
{
valueIsChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnValueChanged(e);
}
}
答案 2 :(得分:0)
我知道你指定你正在做winforms,但是对于将来遇到这种情况的人,我想插入WPF的开源MahApps.Metro toolkit,其中包括DataGridNumericUpDownColumn
。
答案 3 :(得分:0)
MSDN示例代码:http://download.microsoft.com/download/0/1/6/0165999a-7668-4643-a34b-87d2865da596/DGV_NUPD.exe
选择3 .cs文件,将它们添加到您可以去的项目中
相关的MSDN教程:http://msdn.microsoft.com/en-us/library/aa730881(v=vs.80).aspx