Как разрешить вставку в 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