我正在尝试从组合框中检索所选项目,但我无法让它工作。
Form1 form = new Form1();
string cpuCount = form.comboBox1.SelectedItem.ToString();
现在,这不会返回任何东西。但是,如果我在我的InitializeComponent()
中插入此代码,它会选择index = 3的项目,并返回该项目。
comboBox1.SelectedIndex = 3;
为什么它会像这样?如果我现在选择索引= 5的项目,它仍然会认为所选项目是索引= 3的项目。
----------我想我应该扩展以向您展示我的代码的外观。
Form1 - 将所有项目添加到组合框中。
public partial class Form1 : Form
{
Profile profile = new Profile();
public Form1()
{
InitializeComponent();
Profile profile = new Profile();
string[] prof = profile.getProfiles();
foreach (var item in prof)
{
comboBox5.Items.Add(Path.GetFileNameWithoutExtension(item));
}
int ram = 1024;
for (int i = 0; i < 7; i++)
{
comboBox4.Items.Add(ram + " GB");
ram = ram * 2;
}
int vram = 512;
string size;
for (int i = 0; i < 5; i++)
{
if(vram > 1000)
{
size = " GB";
}
else
{
size = " MB";
}
comboBox2.Items.Add(vram + size);
vram = vram * 2;
}
for (int i = 1; i < 5; i++)
{
comboBox1.Items.Add(i * 2);
}
for (int i = 0; i < 5; i++)
{
comboBox3.Items.Add(i * 2);
}
private void button3_Click(object sender, EventArgs e)
{
string current = profile.currentProfile();
profile.saveProfile(current);
}
}
所以,button3是我的“保存”按钮。 这是我的“个人资料” - 类
class Profile
{
public string folder { get; set; }
public Profile()
{
this.folder = "Profiles";
if (!File.Exists(folder))
{
Directory.CreateDirectory(folder);
File.Create(folder + "/default.cfg").Close();
}
}
public string[] getProfiles()
{
string[] files = Directory.GetFiles(folder);
return files;
}
public void saveProfile(string filename)
{
Form1 form = new Form1();
string cpuCount = "cpuCount=" + form.comboBox1.SelectedItem;
string RAM = "maxRAM=" + form.comboBox4.SelectedItem;
string VRAM = "maxVRAM=" + form.comboBox2.SelectedItem;
string threads = "cpuThreads=" + form.comboBox3.SelectedItem;
string path = folder + "/" + filename;
StreamWriter sw = new StreamWriter(path);
string[] lines = { cpuCount, RAM, VRAM, threads };
foreach (var item in lines)
{
sw.WriteLine(item);
}
sw.Close();
}
public string currentProfile()
{
Form1 form = new Form1();
string selected = form.comboBox5.SelectedValue + ".cfg".ToString();
return selected;
}
}
谢谢。
答案 0 :(得分:3)
问题是您的ComboBox
中没有选择任何内容。您创建表单,然后在没有先前的用户交互的情况下,您希望获得此时为空的SelectedItem
。
当您创建ComboBox控件并用项填充时,SelectedItem
属性为null
,直到您以编程方式设置它(通过使用例如comboBox1.SelectedIndex = 3
)或通过用户与控件的交互。在这种情况下,您没有做上述任何事情,这就是您提出上述错误的原因。
编辑根据编辑过的问题
像这样更改你的代码:
首先更改saveProfile
方法,以便将写入的四个字符串传递给文本文件。请注意,您也可以传递表单的引用,但我不建议您这样做。所以改变这样的方法:
public void saveProfile(string filename, string cpuCount, string RAM , string VRAM , string threads)
{
string path = folder + "/" + filename;
using(StreamWriter sw = new StreamWriter(path))
{
sw.WriteLine("cpuCount=" + cpuCount);
sw.WriteLine("maxRAM=" + RAM );
sw.WriteLine("maxVRAM=" + VRAM );
sw.WriteLine("cpuThreads=" + threads);
}
}
然后从button3点击事件处理程序,如下所示:
private void button3_Click(object sender, EventArgs e)
{
string current = profile.currentProfile();
string cpuCount = this.comboBox1.SelectedItem.ToString();
string RAM = this.comboBox4.SelectedItem.ToString();
string VRAM = this.comboBox2.SelectedItem.ToString();
string threads = this.comboBox3.SelectedItem().ToString();
profile.saveProfile(current, cpuCount, RAM, VRAM, threads);
}
或者
private void button3_Click(object sender, EventArgs e)
{
string current = profile.currentProfile();
profile.saveProfile(current, this.comboBox1.SelectedItem.ToString(), this.comboBox4.SelectedItem.ToString(), this.comboBox2.SelectedItem.ToString(), this.comboBox3.SelectedItem().ToString());
}
答案 1 :(得分:2)
从我所看到的情况来看,您在创建form.comboBox1.SelectedItem.ToString()
后立即致电Form1
。这意味着在创建表单之后立即初始化cpuCount
变量,这是在您有机会使用鼠标更改所选项目之前。
如果要在更改后检索组合框的值,可以使用SelectedIndexChanged
事件。
答案 2 :(得分:2)
首先,添加一个Form_Load事件并将您的代码放入处理程序中。 (使用构造函数进行属性初始化和其他变量初始化)
private void Form1_Load(object sender, EventArgs e)
{
this.comboBox1.SelectedItem= 5; // This will set the combo box to index 5
string cpuCount = this.comboBox1.SelectedText; // This will get the text of the selected item
}
所以你得到cpuCount
变量中索引5处的item值。
selected
子句为您提供选择后的值,默认情况下(当您运行应用程序时)comoboBox中没有选择任何内容,因此,在选择项目后,它会将值显示为null你可以使用组合框的selectedItem,selectedIndex,selectedText和selectedValue属性。
您还可以使用数据绑定来显示组合框中的项目,在我看来,这是更好的方法,然后手动添加项目。
对您可以使用的组合框进行数据绑定,
// Bind your combobox to a datasource, datasource can be a from a database table, List, Dataset, etc..
IDictionary<int, string> comboDictionary = new Dictionary<int, string>();
comboDictionary.Add(1, "first");
comboDictionary.Add(2, "second");
comboDictionary.Add(3, "third");
comboBox1.DataSource = comboDictionary;
comboBox1.DisplayMember = "Key";
comboBox1.ValueMember = "Value";
//
现在,您可以使用combobox1.SelectedIndex遍历数据源中的项集合:)当您使用combobox1.SelectedValue时,它将为您提供密钥的值。希望这可以帮助。
答案 3 :(得分:0)
您的ComoboBox中没有项目。所以它不会正常返回。您在创建表单对象后访问组合框选定的值权限。
如果comboBox有项目,则没有选择任何内容。默认情况下,comboBox中未选择任何内容。你需要设置它。用这个。什么回报?设置comboBox.SelectedIndex,然后获取selectedItem。
int selectedIndex = form.comboBox1.SelectedIndex;
试试这个。在ComboBox中添加一些项目,然后获取selectedItem。
Form1 form = new Form1();
form.comboBox1.Add("Item 1");
form.comboBox1.Add("Item 2");
form.comboBox1.Add("Item 3");
form.comboBox1.SelectedIndex = 1;
string cpuCount = form.comboBox1.SelectedItem.ToString();