[英]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.