简体   繁体   English

Winforms将文本文件加载到datagridview并在组合框中设置默认值

[英]Winforms load text file to datagridview and set default value in combobox

I have my problem in my datagrid view. 我在datagrid视图中遇到了问题。

在此处输入图片说明

The datagridview is from the text file: datagridview来自文本文件:

Student Name|Grade Level|Student Number|Gender 学生姓名|年级|学生编号|性别

John,Grade 7,54015, 1 约翰,7,54015年级, 1

Jessy,Grade 3,20147, 2 杰西,3,20147级,2

Kyle,Grade 9,41812, 1 Kyle,9,41812年级, 1

Howard,Grade 6,8436, 1 霍华德6,8436年级, 1

And my code: 而我的代码:

        var lines = File.ReadAllLines(@"C:\Users\1\Desktop\1.txt");
        if (lines.Count() > 0)
        {
            foreach (var columnName in lines.FirstOrDefault()
                .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
            {
                dataGridView1.Columns.Add(columnName, columnName);
            }
            foreach (var cellValues in lines.Skip(1))
            {
                var cellArray = cellValues
                    .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                if (cellArray.Length == dataGridView1.Columns.Count)
                    dataGridView1.Rows.Add(cellArray);
            }
            foreach (var columnName in lines.First()
         .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
            {
                if (columnName == "Gender")
                {
                    var dgc = new DataGridViewComboBoxColumn() { Name = "hi", HeaderText = "bye" };
                    // dgc.Items.AddRange("Male", "Female");


                    DataTable dt = new DataTable();
                    DataColumn dc1 = new DataColumn("ID");
                    DataColumn dc2 = new DataColumn("Name");
                    dt.Columns.Add(dc1);
                    dt.Columns.Add(dc2);
                    dt.Rows.Add(1, "Male");
                    dt.Rows.Add(2, "Female");


                    DataGridViewComboBoxColumn c1 = new DataGridViewComboBoxColumn();
                    c1.DataSource = dt;
                    c1.DisplayMember = "Name";
                    c1.ValueMember = "ID";


                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (dt.Rows[i]["ID"].ToString() == "1") // 1 for MALE & 2 for FEMALE
                        {
                            c1.DefaultCellStyle.NullValue = dt.Rows[i]["Name"];
                        }

                    }
                    dataGridView1.Columns.Add(c1);
                    continue;
                }

            }
        }

What i want is to remove the 3rd column and replace it by the fourth column and also to change the value of this 我想要的是删除第三列,并用第四列替换它,并更改此值

if (dt.Rows[i]["ID"].ToString() == " 1 ") // 1 for MALE & 2 for FEMALE on value member ID if(dt.Rows [i] [“ ID”]。ToString()==“ 1 ”)//对于值成员ID,MALE为1,FEMALE为2

to the fourth value of a line in the text file. 到文本文件中一行的第四个值。

John,Grade 7,54015, 1 约翰,7,54015年级, 1

Jessy,Grade 3,20147, 2 杰西,3,20147级,2

Kyle,Grade 9,41812, 1 Kyle,9,41812年级, 1

Howard,Grade 6,8436, 1 霍华德6,8436年级, 1

If the value is 1, the default value of combobox is male. 如果值为1,则组合框的默认值为male。 While, if the value 2, the default value of combobox is female. 而如果值为2,则组合框的默认值为女性。 Can anyone fix and edit my code? 谁能修复和编辑我的代码?

Thanks to everyone! 谢谢大家!

Try changing your first loop to handle the "gender" column differently than the rest. 尝试更改您的第一个循环,以处理“性别”列,而不是其余的。

Create a ComboBox column and populate it with the two gender values. 创建一个ComboBox列,并使用两个性别值填充它。

foreach (var columnName in lines.First()
             .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
{
    if (columnName == "Gender")
    {
        var dgc = new DataGridViewComboBoxColumn() { HeaderText = "Gender" };
        dgc.Items.AddRange(
            new KeyValuePair<string, string>("1", "Male"),
            new KeyValuePair<string, string>("2", "Female"));
        dgc.ValueMember = "Key";
        dgc.DisplayMember = "Value";

        dataGridView1.Columns.Add(dgc);
        continue;
    }

    dataGridView1.Columns.Add(columnName, columnName);
}

Then when you add your rows of data, including the gender, it should display correctly in the ComboBox but also allow you to change the value. 然后,当您添加数据行(包括性别)时,它应正确显示在ComboBox中,但也允许您更改值。


Edit (update for setting a default value in the ComboBox): 编辑(更新以在ComboBox中设置默认值):

foreach (var cellValues in lines.Skip(1))
{
    var cellArray = cellValues.Split(new[] { ',' });

    if (cellArray.Length == dataGridView1.Columns.Count)
    {
        if (String.IsNullOrEmpty(cellArray[dataGridView1.Columns.Count]))
            cellArray[dataGridView1.Columns.Count] = "1";

        dataGridView1.Rows.Add(cellArray);
    }
}

Basically, the above just looks at the last "column" from the file and, if it's empty, then default to "Male". 基本上,上面只是查看文件中的最后一个“列”,如果为空,则默认为“ Male”。

I also removed StringSplitOptions.RemoveEmptyEntries . 我还删除了StringSplitOptions.RemoveEmptyEntries That option will only return 3 elements in cellArray when the gender column is empty, which will also cause cellArray.Length == dataGridView1.Columns.Count to fail. 当性别cellArray空时,该选项将仅在cellArray返回3个元素,这也将导致cellArray.Length == dataGridView1.Columns.Count失败。

This works, 这样有效

        DataTable dt = new DataTable();
        dt.Columns.Add("ID");
        dt.Columns.Add("Name");
        dt.Rows.Add(1, "Male");
        dt.Rows.Add(2, "Female");

        var lines = File.ReadAllLines(@"C:\Users\1\Desktop\1.txt");
        if (lines.Count() > 0)
        {
            foreach (var columnName in lines.FirstOrDefault()
                .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
            {
                if (columnName == "Gender")
                {
                    var c1 = new DataGridViewComboBoxColumn();
                    c1.DataSource = dt;
                    c1.DisplayMember = "Name";
                    c1.ValueMember = "ID";
                    c1.HeaderText = "Gender";

                    dataGridView1.Columns.Add(c1);
                    continue;
                }
                dataGridView1.Columns.Add(columnName, columnName);
            }
            foreach (var cellValues in lines.Skip(1))
            {
                var cellArray = cellValues
                    .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                if (cellArray.Length == dataGridView1.Columns.Count)
                    dataGridView1.Rows.Add(cellArray);
            }
        }

I also like to point out that you are using 我也想指出您正在使用

cellValues.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

which could be dangerous, because of StringSplitOptions.RemoveEmptyEntries the entry 由于StringSplitOptions.RemoveEmptyEntries条目,这可能很危险

Hulk,,8436,1

would be skipped. 将被跳过。

And I would suggest you use a DataTable as a DataSource 我建议您使用DataTable作为数据源

    private void Form1_Shown(object sender, EventArgs e)
    {


        DataTable dt = new DataTable();
        dt.Columns.Add("ID");
        dt.Columns.Add("Name");
        dt.Rows.Add(1, "Male");
        dt.Rows.Add(2, "Female");

        var table = GetDataTable(@"C:\temp\1.txt");
        foreach (DataColumn column in table.Columns)
        {
            var columnName = column.ColumnName;
            DataGridViewColumn col;
            if (columnName == "Gender")
            {
                var c1 = new DataGridViewComboBoxColumn();
                c1.DataSource = dt;
                c1.DisplayMember = "Name";
                c1.ValueMember = "ID";
                col = c1;
            }
            else
            {
                col = new DataGridViewTextBoxColumn();
            }
            col.HeaderText = "Gender";
            col.DataPropertyName = columnName;
            dataGridView1.Columns.Add(col);

        }
        dataGridView1.DataSource = table;
    }

the method could look like this 方法看起来像这样

    private DataTable GetDataTable(string fileName)
    {
        var table = new DataTable();
        var lines = File.ReadAllLines(@"C:\temp\1.txt");
        if (lines.Count() > 0)
        {
            foreach (var columnName in lines.FirstOrDefault()
                .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
            {
                table.Columns.Add(columnName);
            }
            foreach (var cellValues in lines.Skip(1))
            {
                var cellArray = cellValues
                    .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                if (cellArray.Length == table.Columns.Count)
                    table.Rows.Add(cellArray);
            }
        }
        return table;
    }

Do something like this, 做这样的事情

 public partial class Form1 : Form
    {
        bool bIsComboBox = false;
        delegate void SetComboBoxCellType(int iRowIndex);
        DataTable dt = new DataTable();
        public Form1()
        {
            InitializeComponent();

            var lines = File.ReadAllLines(@"C:\\1.txt");
            if (lines.Count() > 0)
            {
                foreach (var columnName in lines.FirstOrDefault()
                    .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    dt.Columns.Add(columnName, typeof(string));
                }
                foreach (var cellValues in lines.Skip(1))
                {
                    var cellArray = cellValues
                        .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                  //  if (cellArray.Length == dataGridView1.Columns.Count)
                        dt.Rows.Add(cellArray);
                }
                dataGridView1.DataSource = dt;

            }

        }


        private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            SetComboBoxCellType objChangeCellType = new SetComboBoxCellType(ChangeCellToComboBox);

            if (e.ColumnIndex == this.dataGridView1.Columns["Gender"].Index)
            {
                this.dataGridView1.BeginInvoke(objChangeCellType, e.RowIndex);
                bIsComboBox = false;
            }
        }
        private void ChangeCellToComboBox(int iRowIndex)
        {
            if (bIsComboBox == false)
            {
                DataGridViewComboBoxCell dgComboCell = new DataGridViewComboBoxCell();
                dgComboCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;


                dgComboCell.DataSource = dt;
                dgComboCell.ValueMember = "Gender";
                dgComboCell.DisplayMember = "Gender";

                dataGridView1.Rows[iRowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex] = dgComboCell;
                bIsComboBox = true;
            }
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM