我在迭代DataGridView时遇到了一些问题。
现在我有一个文本文件(只是一个长字符串:true; false; true等)。
现在我想读取这个文件,并在我的DataGridView中设置CheckBoxColumn的值: file中的第一个值=第一个CheckBoxCell的状态 file中的第二个值=第二个CheckBoxCell的状态 等等
解析字符串没有问题,但我不知道如何遍历单元格并设置值。
有人可以帮忙吗?
问候
修改 使用了OhBeWise的答案,现在有以下代码片段:
private void Btn_LoadChampions_Click(object sender, EventArgs e)
{
string allChampionStates = null;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Title = "Open Text File";
openFileDialog1.Filter = "CSV|*.csv";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
allChampionStates = File.ReadAllText(openFileDialog1.FileName);
List<string> vals = allChampionStates.TrimEnd(';').Split(';').ToList();
int maxRows = Math.Min(this.dataGridView1.Rows.Count, vals.Count);
for (int i = 0; i < maxRows; i++)
{
DataGridViewCheckBoxCell cell = (DataGridViewCheckBoxCell)this.dataGridView1.Rows[i].Cells["Status"];
cell.Value = vals[i] == "true";
}
}
}
但现在它将所有复选框值设置为false,即使只有前五个为false而其他所有都为true。有什么想法吗?
编辑2: 简单的错误:我确实保存了真正的&#39;而不是&#39; true&#39; :D就像一个魅力。谢谢
答案 0 :(得分:0)
一种方式:
// Retrieve the cell value for the cell at column 3, row 7.
String testValue1 = (String)dataGridView1[3, 7].Value;
https://msdn.microsoft.com/fr-fr/library/ms158656(v=vs.110).aspx
答案 1 :(得分:0)
这是一个简单的解决方案,有两个例子:
DataGridView.DataSource
未绑定,因此尚不存在任何行。DataGridView.DataSource
已绑定,因此存在行。无约束示例
private void AddCheckColumn()
{
DataGridViewCheckBoxColumn col = new DataGridViewCheckBoxColumn();
col.Name = "Checked";
if (!this.dataGridView1.Columns.Contains(col.Name))
{
this.dataGridView1.Columns.Add(col);
string values = "true;false;true;false;";
List<string> vals = values.TrimEnd(';').Split(';').ToList();
foreach (string val in vals)
{
DataGridViewRow row = new DataGridViewRow();
row.CreateCells(this.dataGridView1);
DataGridViewCheckBoxCell cell = (DataGridViewCheckBoxCell)row.Cells[0];
cell.Value = val == "true";
this.dataGridView1.Rows.Add(row);
}
}
}
绑定示例
public class Example
{
public string Foo { get; set; }
public string Bar { get; set; }
}
public Form1()
{
InitializeComponent();
this.AddDataSource();
}
public BindingList<Example> Examples { get; set; }
private void AddDataSource()
{
this.Examples = new BindingList<Example>()
{
new Example() { Bar = "Bar 1", Foo = "Foo 1"},
new Example() { Bar = "Bar 2", Foo = "Foo 2"},
new Example() { Bar = "Bar 3", Foo = "Foo 3"},
new Example() { Bar = "Bar 4", Foo = "Foo 4"},
};
this.dataGridView1.DataSource = this.Examples;
}
private void AddCheckColumn()
{
DataGridViewCheckBoxColumn col = new DataGridViewCheckBoxColumn();
col.Name = "Checked";
if (!this.dataGridView1.Columns.Contains(col))
{
this.dataGridView1.Columns.Add(col);
string values = "true;false;true;false;";
List<string> vals = values.TrimEnd(';').Split(';').ToList();
int maxRows = Math.Min(this.dataGridView1.Rows.Count, vals.Count);
for (int i = 0; i < maxRows; i++)
{
DataGridViewCheckBoxCell cell = (DataGridViewCheckBoxCell)this.dataGridView1.Rows[i].Cells["Checked"];
cell.Value = vals[i] == "true";
}
}
}
共同点
在两个示例中,调用方法如下:
private void Form1_Load(object sender, EventArgs e)
{
this.AddCheckColumn();
}
这是一个有效的例子。希望这会有所帮助。
修改强>
请注意,如果 绑定到DataSource
对象,那么只需向对象添加布尔属性并将值加载到对象列表中就更合适了结合。
private void AddDataSource()
{
this.Examples = new BindingList<Example>()
{
new Example() { Bar = "Bar 1", Foo = "Foo 1"},
new Example() { Bar = "Bar 2", Foo = "Foo 2"},
new Example() { Bar = "Bar 3", Foo = "Foo 3"},
new Example() { Bar = "Bar 4", Foo = "Foo 4"},
};
string values = "true;false;true;false;";
List<string> vals = values.TrimEnd(';').Split(';').ToList();
int maxRows = Math.Min(this.Examples.Count, vals.Count);
for (int i = 0; i < maxRows; i++)
{
this.Examples[i].Checked = vals[i] == "true";
}
this.dataGridView1.DataSource = this.Examples;
}
然后,您不需要AddCheckColumn()
或Form1_Load
。