无法填充在设计时创建的DataGridViewComboBoxColumn

时间:2013-06-21 07:41:29

标签: winforms c#-4.0 datagridview

我在设计时有一个DataGridViewComboBoxColumn。但是我想在运行时进行操作。但它没有发生。

这是整个代码

public partial class Form1 : Form
    {
        private List<FileInformation> FileInformationList;
        public Form1()
        {
            InitializeComponent();
            PrepareGrid();
            DisplayResult();
        }

        private void PrepareGrid()
        {

            var fileNameColumn = new DataGridViewTextBoxColumn
            {
                Name = @"FileName",
                HeaderText = "File Name",
                DataPropertyName = @"FileName",
                AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
                ReadOnly = false,
                Frozen = false
            };
            dataGridView1.Columns.Add(fileNameColumn);

            var downloadColumn = new DataGridViewLinkColumn

            {
                Name = @"Download",
                HeaderText = @"Download",
                DataPropertyName = @"Download",
                AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
                ReadOnly = true
            };
            dataGridView1.Columns.Add(downloadColumn);

            var dropdownColumn = new DataGridViewComboBoxColumn

            {
                Name = @"Test",
                HeaderText = @"Country",                
                AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
                ReadOnly = true
            };
            dataGridView1.Columns.Add(dropdownColumn);
        }

        private void DisplayResult()
        {
            FileInformationList = LoadItems();
            dataGridView1.DataSource = FileInformationList;

            ((DataGridViewComboBoxColumn)dataGridView1.Columns["Test"]).DataSource = GetCountryList();
            ((DataGridViewComboBoxColumn)dataGridView1.Columns["Test"]).ValueMember = "id";
            ((DataGridViewComboBoxColumn)dataGridView1.Columns["Test"]).DisplayMember = "Name";

        }

        private List<FileInformation> LoadItems()
        {
            var lstScriptInfo = new List<FileInformation>();
            for (int i = 1; i <= 5; i++)
            {
                lstScriptInfo.Add(new FileInformation { FileName = "File" + i.ToString() + ".txt" });
            }
            return lstScriptInfo;
        }

        private DataTable GetCountryList()
        {
            DataTable CountryDt = new DataTable();
            CountryDt.Columns.Add("id");
            CountryDt.Columns.Add("Name");
            CountryDt.Rows.Add("1", "Canada");
            CountryDt.Rows.Add("2", "USA");
            return CountryDt;
        }

    }

    public class FileInformation
    {
        public string FileName { get; set; }
        public string Download { get { return "Download File"; } }
    }
}

输出

enter image description here

请帮我辨别哪里出了问题?

1 个答案:

答案 0 :(得分:1)

实现这一目标的两种方法:

  1. 为列设置defualt null值(跳过空检查):

    var cbColumn = (DataGridViewComboBoxColumn)dataGridView1.Columns["Test"];
    var ds = GetCountryList();
    
    cbColumn.DataSource = ds;
    cbColumn.ValueMember = "id";
    cbColumn.DisplayMember = "Name";
    
    cbColumn.DefaultCellStyle.NullValue = ds.Rows[0][0];
    cbColumn.DefaultCellStyle.DataSourceNullValue  = ds.Rows[0][1];
    
  2. 其次是在DataBinding之后迭代并手动设置:

    private void DataGridDataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            var hasValue = row.Cells["Test"].Value != null;
    
            if (!hasValue)
            {
                 row.Cells["Test"].Value = 1;
            }
        }
    }
    
  3. 我也会更改绑定顺序:

    private void DisplayResult()
    {
        var cbColumn = (DataGridViewComboBoxColumn)dataGridView1.Columns["Test"];
        var ds = GetCountryList();
    
        cbColumn.DataSource = ds;
        cbColumn.ValueMember = "id";
        cbColumn.DisplayMember = "Name";
    
        cbColumn.DefaultCellStyle.NullValue = ds.Rows[0][0];
        cbColumn.DefaultCellStyle.DataSourceNullValue  = ds.Rows[0][1];
    
        FileInformationList = LoadItems();
        dataGridView1.DataSource = FileInformationList;
    }