9
votes

Comment permettre l'insertion sur DataGridView?

Je dois relier un datagridview à partir d'une liste . J'ai défini sur le concepteur activer l'ajout .

Si la liste est NULL, je crée une liste vide afin que les en-têtes soient affichés, mais cela ne crée pas une ligne vide pour que je puisse être capable de pouvoir Ajouter des éléments. Pourquoi? Comment puis-je activer l'utilisateur d'ajouter des valeurs à cette liste?

Quelqu'un code xxx


2 commentaires

Pourquoi n'êtes-vous pas contraignant sur un BindingList ? msdn.microsoft.com/en-us/library/ms132679.aspx


@Jon je ne savais pas sur BindingList , je ne coporte généralement pas sur Winforms. Changer-le à un Bindinglist a fonctionné, merci.


3 Réponses :


14
votes

Tout d'abord, DataGridView UservationAnservationadroadrows code> doit être true code> (et c'est puisque vous le réglez dans le concepteur).

Cette propriété dit P>

Si la DataGridView est liée aux données, L'utilisateur est autorisé à ajouter des rangées si cette propriété et les données ibindinglist de la source.allownew la propriété est définie sur true. p> blockQuote>

ibindinglist.allownew code> (qui n'est pas réglable) mentionne également: P>

si ilist.effixedsize ou Ilist.isreadonly est vrai, cela La propriété retourne false. p> blockquote>

puisque vous liez un ienumerable code>, je pense que isreadonly code> est false code>. Essayez d'exposer la liste sous la liste Liste code> et de la liaison à un BindingList code>. P>

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);
}


0 commentaires

1
votes

Ajout à la réponse de Jon: BindingList code> a un événement, addingrow code>, que vous pouvez écouter, pour spécifier l'élément à ajouter:

AddHandler _bindingList.AddingNew, Sub(s, args)
                                           args.NewObject = New TicketItem("dawg")
                                       End Sub


0 commentaires

4
votes

Cette propriété sera false si vous avez DataGridView.allowAserAdrows = TRUE; Mais ne disposez pas de constructeur par défaut pour votre classe de liaison. Ajouter par défaut et fonctionner

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);
    }


1 commentaires

Ajouter un constructeur par défaut l'a fait pour moi. Merci!