【问题标题】:DataGridView missing new-row with empty datasourceDataGridView 缺少带有空数据源的新行
【发布时间】:2014-01-02 13:41:38
【问题描述】:

我正在创建一个应用程序,它使用 DataGridView 创建和修改稍后将导入系统的本地列表。它应该可由用户编辑(在 DGV 中单击和写入),并且它还应该支持从 csv 导入,这意味着我需要在 DGV 和数据源之间进行 2 路同步。

我已将 DGV 的 DataSource 设置为 BindingList<Client>,如下所示:

//In my seperate Client class-file
public class Client
{
    private string _name;
    private string _mac;
    private string _status;

    public Client(string pcnavn, string MAC)
    {
        _pcnavn = pcnavn;
        _mac = mac;
    }

    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }

    public string MAC
    {
        get
        {
            return _mac;
        }
        set
        {
            _mac = value;
        }
    }

    public string Status
    {
        get
        {
            return _status;
        }
        set
        {
            _status = value;
        }
    }
}

//In my mainform class

public BindingList<Client> clientDataSource = new BindingList<Client>();

public MainForm()
{
InitializeComponent();
//clienDataGridView.AutoGenerateColumns = false; //The duplicate columns where fixed by setting DataPropertyName for all columns.
clientDataGridView.DataSource = clientDataSource;
}

使用这种方法,生成了 DGV,但它是空的(只有标题),因此用户无法使用 DGV 添加行。如果没有 DataSource,它会像 SQL 编辑器一样显示一个空白行,因此我可以在 DGV 中手动创建行。链接到空数据源时,如何显示“新项目”行?我发现的所有示例都使用非空数据源。

AllowUserToAddRowsAllowUserToDeleteRows 设置为 true

这张照片显示了我的问题。使用数据源时缺少“第一行”。无法通过键入 DGV 添加数据。

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    在查看MSDN 时,我发现了这个:

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

    看来BindingList默认这个属性是false,所以这个小技巧修复了它:

    public BindingList<Client> clientDataSource = new BindingList<Client>() { AllowNew = true };
    

    【讨论】:

    • 很高兴您找到了解决方案。
    • 谢谢,我在设计器中设置了 de bindingsource 的 AllowNew 属性,但还是不行。直到我使用 bindingSource 的 Datasource 属性而不是 datagridview 本身的属性来绑定数据。那行得通。
    【解决方案2】:

    我猜你缺少DataPropertyName 设置。

    1. 首先,您必须将列添加到数据网格中。转到添加列选项并使用向导添加所需的列。

    2. 其次,您必须在向导模式下编辑每一列并设置DataPropertyName。基本上,对于您创建的每个网格列,您需要提供 Client 类的确切绑定属性名称。


    Displaying Empty Row

    当您将空列表绑定到 DGV 时,默认行将被删除。如果你需要显示一个空行然后这样做,

    //Adding a client object to the collection so that an empty row will be inserted to DGV
    clientDataSource.Add(new Client());
    clientDataGridView.DataSource = clientDataSource;
    

    【讨论】:

    • 我实际上错过了其中一栏的内容,但我在其余的栏目上都有。所以现在我在删除AutoGenerateColumns 时没有得到重复的列,但是在指定数据源时我仍然没有得到第一个空白行。我会用问题的图片更新问题:)
    • 你先生,真是天才!一个小“问题”。完成此操作后,我得到一个空白行加上“新行”(带有星号),就像我的图片顶部一样。在一个完美的世界里,我只想要那个。因为如果我使用您的解决方案,我将需要创建自定义逻辑以避免人们在只有我创建的空白对象时按下运行按钮。我知道我不太擅长解释,但你听懂了吗? :-) 有什么建议吗?
    • @Graimer 我找不到你,你现在看到两行空了吗?我没明白你说的“运行”按钮的意思。
    • 我有一个运行按钮来开始处理客户端列表(将它们添加到 SCCM)。但是,是的,我有 2 个空行。列表中的一个对象 + datagridview 显示的“新行”行。谢谢你的帮助。我会投票,但是当我找到自己的“完美”解决方案时(请参阅我的答案),我会将我的答案标记为答案。再次感谢! :-)
    【解决方案3】:

    在此处查看配置

    try
    {
    
      int id =Convert.ToInt32( textBox1.Text);
        string query = "SELECT * FROM ngo.inser WHERE ID LIKE '%" + id + "%'";
        command = new MySqlCommand(query, connection);
        adapter = new MySqlDataAdapter(command);
        table = new DataTable();
        adapter.Fill(table);
    
        dataGridView1.DataSource = table;
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    

    然后转到datagridview编辑列设置。在具有 DataPropertyName 的 DATA 菜单中,将非属性更改为实际的数据库列名。然后它将向您显示该列信息。如果您有多个列,则设置所有信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 2013-09-10
      • 2016-07-18
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多