簡體   English   中英

Winforms將文本文件加載到datagridview並在組合框中設置默認值

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

我在datagrid視圖中遇到了問題。

在此處輸入圖片說明

datagridview來自文本文件:

學生姓名|年級|學生編號|性別

約翰,7,54015年級, 1

傑西,3,20147級,2

Kyle,9,41812年級, 1

霍華德6,8436年級, 1

而我的代碼:

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

            }
        }

我想要的是刪除第三列,並用第四列替換它,並更改此值

if(dt.Rows [i] [“ ID”]。ToString()==“ 1 ”)//對於值成員ID,MALE為1,FEMALE為2

到文本文件中一行的第四個值。

約翰,7,54015年級, 1

傑西,3,20147級,2

Kyle,9,41812年級, 1

霍華德6,8436年級, 1

如果值為1,則組合框的默認值為male。 而如果值為2,則組合框的默認值為女性。 誰能修復和編輯我的代碼?

謝謝大家!

嘗試更改您的第一個循環,以處理“性別”列,而不是其余的。

創建一個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);
}

然后,當您添加數據行(包括性別)時,它應正確顯示在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);
    }
}

基本上,上面只是查看文件中的最后一個“列”,如果為空,則默認為“ Male”。

我還刪除了StringSplitOptions.RemoveEmptyEntries 當性別cellArray空時,該選項將僅在cellArray返回3個元素,這也將導致cellArray.Length == dataGridView1.Columns.Count失敗。

這樣有效

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

我也想指出您正在使用

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

由於StringSplitOptions.RemoveEmptyEntries條目,這可能很危險

Hulk,,8436,1

將被跳過。

我建議您使用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;
    }

方法看起來像這樣

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

做這樣的事情

 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