DataGridView
можно настроить для учета желаемого варианта использования для отправки Empty.String
при получении нулевого ввода.
От: Свойство DataGridViewCellStyle.DataSourceNullValue
Получает или задает значение, сохраненное в источнике данных, когда пользователь вводит нулевое значение в ячейку.
От: Свойство DataGridViewColumn.DefaultCellStyle
Получает или задает стиль ячейки столбца по умолчанию.
Указанные выше свойства используются для настройки DataGridView
. Тем не менее, DataTable
нуждается в небольшом изменении.
От: Свойство DataColumn.DefaultValue
Получает или задает значение по умолчанию для столбца при создании новых строк.
Можно подумать, что свойство DefaultNewRowValue DataGridVierwColumn
CellTemplate *1033* предоставит это, но не в случае с привязанным столбцом. Если используются дополнительные столбцы, и это свойство не изменяется по умолчанию, исходная проблема будет всплывающим.
Следующий пример предназначен для решения вашей проблемы, как описано в ваших рекомендациях по воспроизведению, и предполагает, что для DataGridview.DataSource
установлено значение DataTable
или DataView
. Он использует событие DataGridView.BindingContextChanged
для обработки автоматически сгенерированных столбцов DataGridView после установки свойства DataSource.
public partial class Form1 : Form
{
private DataTable dt;
public Form1()
{
InitializeComponent();
dataGridView1.BindingContextChanged += new System.EventHandler(this.dataGridView1_BindingContextChanged);
dt = new DataTable();
DataColumn dc = dt.Columns.Add("C0");
dc.AllowDBNull = false;
dataGridView1.DataSource = dt.DefaultView;
}
private void dataGridView1_BindingContextChanged(object sender, EventArgs e)
{
if (dataGridView1.DataSource != null)
{
DataTable boundTable = dataGridView1.DataSource as DataTable;
if (boundTable == null)
{
DataView dv = dataGridView1.DataSource as DataView;
if (dv != null)
{
boundTable = dv.Table;
}
}
if (boundTable != null)
{
foreach (DataGridViewColumn c in dataGridView1.Columns)
{
if (c.IsDataBound)
{
DataColumn dc = boundTable.Columns[c.DataPropertyName];
if (!dc.AllowDBNull && dc.DataType == typeof(string))
{
c.DefaultCellStyle.DataSourceNullValue = string.Empty;
dc.DefaultValue = string.Empty; // this value is pulled for new rows
}
}
}
}
}
}
}