Как разрешить вставку в DataGridView?
Я связываю DataGridView
С List<T>
. Я поставил на дизайнера Enable adding
.
если список равен null, я создаю пустой список, поэтому отображаются заголовки, но он не создает пустую строку для меня, чтобы иметь возможность добавлять элементы. Почему? Как разрешить пользователю добавлять значения в этот список?
код
public IEnumerable<Value> ValueList
{
get;
set;
}
private void Form1_Load(object sender, EventArgs ev)
{
if (ValueList == null)
{
ValueList = new List<Value>();
}
dataGrid.DataSource = ValueList;
}
3 ответов
прежде всего,DataGridView.AllowUserToAddRows
должно быть true
(и это, так как вы устанавливаете его в конструкторе).
это свойство говорит
если DataGridView привязан к данным, пользователь может добавлять строки, если как это свойство, так и данные источник IBindingList.AllowNew свойству установлено значение true.
IBindingList.AllowNew
(который не устанавливается) также упоминает:
если То IList.IsFixedSize или То IList.IsReadOnly верно, это свойство возвращает значение false.
так как вы привязаны к IEnumerable
Я считаю IsReadOnly
is false
. Попробуйте представить список как List<T>
и привязка к BindingList<T>
.
public List<Value> ValueList
{
get;
set;
}
private void Form1_Load(object sender, EventArgs ev)
{
if (ValueList == null)
{
ValueList = new List<Value>();
}
dataGrid.DataSource = new BindingList<Value>(ValueList);
}
это свойство будет false, если у вас есть DataGridView.AllowUserToAddRows = true; но не имеют конструктора по умолчанию для класса привязки. Добавьте default и он должен работать
public class atsTableInclude
{
// keep this to allow user to add row
public atsTableInclude() { }
public atsTableInclude(string p, bool u)
{
Prefix = p;
Use = u;
}
public string Prefix { get; set; }
public bool Use { get; set; }
}
public Sorting.SortableBindingList<T> FillAtsList<T>(string jsonfile) where T : class
{
if (!File.Exists(jsonfile))
{
MessageBox.Show(jsonfile, "File not found");
return null;
}
try
{
// load json from file
using (StreamReader r = new StreamReader(jsonfile))
{
string json = r.ReadToEnd();
var res = JsonConvert.DeserializeObject<List<T>>(json);
return new Sorting.SortableBindingList<T>(res);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Cannot load json", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return null;
}
private void frmATS_Load(object sender, EventArgs e)
{
string jsonfile2 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "atsTableInclude.json");
dataGridView2.DataSource = FillAtsList<atsTableInclude>(jsonfile2);
}
добавление к ответу Джона:BindingList<T>
есть событие, AddingRow
, который вы можете слушать, чтобы указать элемент, который будет добавлен:
AddHandler _bindingList.AddingNew, Sub(s, args)
args.NewObject = New TicketItem("dawg")
End Sub