【问题标题】:How to allow inserting on DataGridView?如何允许在 DataGridView 上插入?
【发布时间】:2011-04-07 01:49:12
【问题描述】:

我正在从List<T> 绑定DataGridView。我已经设置了设计师Enable adding

如果列表为空,我将创建一个空列表,以便显示标题,但它不会为我创建一个能够添加元素的空行。为什么?如何使用户能够向此列表添加值?

一些代码

public IEnumerable<Value> ValueList
{
    get;
    set;
}

private void Form1_Load(object sender, EventArgs ev)
{
    if (ValueList == null)
    {
        ValueList = new List<Value>();
    }

    dataGrid.DataSource = ValueList;
}

【问题讨论】:

标签: c# winforms datagridview


【解决方案1】:

首先,DataGridView.AllowUserToAddRows 必须是true(因为你是在设计器中设置的)。

那个属性说

如果DataGridView绑定了数据, 允许用户添加行,如果 此属性和数据 源的 IBindingList.AllowNew 属性设置为 true。

IBindingList.AllowNew(不可设置)还提到:

如果 IList.IsFixedSize 或 IList.IsReadOnly 是真的,这个 属性返回 false。

由于您绑定到IEnumerable,我相信IsReadOnlyfalse。尝试将列表公开为 List&lt;T&gt; 并绑定到 BindingList&lt;T&gt;

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

【讨论】:

    【解决方案2】:

    如果您有 DataGridView.AllowUserToAddRows = true; 该属性将为 false;但您的绑定类没有默认构造函数。 添加默认值,它应该可以工作

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

    【讨论】:

    • 添加默认构造函数为我做了。谢谢!
    【解决方案3】:

    添加到 Jon 的答案:BindingList&lt;T&gt; 有一个事件 AddingRow,您可以收听该事件来指定要添加的项目:

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

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多