假设我有以下文本文件:
100 Rogue common_mark_job_0018
101 Fighter common_mark_job_0019
102 Kahuna common_mark_job_0020
103 Spell Singer common_mark_job_0026
110 Champion common_mark_job_0022
111 Archer common_mark_job_0023
112 Druid common_mark_job_0024
113 Battle Kahuna common_mark_job_0031
114 Evoker common_mark_job_0032
120 Berserker common_mark_job_0027
121 Marksman common_mark_job_0029
122 Magus common_mark_job_0028
123 War Kahuna common_mark_job_0030
124 Beast Master common_mark_job_ga_2summon01
200 Guide common_mark_job_0033
201 Holy Warrior common_mark_job_0002
202 Cleric common_mark_job_0003
203 Breeder common_mark_job_0004
210 Knight common_mark_job_0034
211 Soldier common_mark_job_0035
212 Bishop common_mark_job_0006
213 Priest common_mark_job_0007
214 Soul Breeder common_mark_job_0009
220 Templar common_mark_job_0005
221 Mercenary common_mark_job_de_2summon01
222 Cardinal common_mark_job_0008
223 Oracle common_mark_job_0037
224 Master Breeder common_mark_job_0039
300 Stepper common_mark_job_0040
301 Strider common_mark_job_0010
302 Dark Magician common_mark_job_0011
303 Sorcerer common_mark_job_0012
310 Assassin common_mark_job_0013
311 Shadow Hunter common_mark_job_0014
312 Chaos Magician common_mark_job_0015
313 Warlock common_mark_job_0016
314 Battle Summoner common_mark_job_0017
320 Slayer common_mark_job_0041
321 Deadeye common_mark_job_0042
322 Void Mage common_mark_job_0043
323 Corruptor common_mark_job_0044
324 Overlord common_mark_job_0045
我正在尝试在我的ComboBoxEdit上加载它(上面的文字)(应该和简单的ComboBox一样),我在Form1_Load或ComboBoxEdit On_click上做这个,它们都可以正常工作。
{
if (comboBoxEdit2.Text != string.Empty)
{
}
else
{
ComboBoxItemCollection coll = comboBoxEdit2.Properties.Items;
coll.BeginUpdate();
try
{
Assembly assembly = Assembly.LoadFile(Application.StartupPath + "/MyLists.dll");
System.Resources.ResourceManager resourcemanager = new System.Resources.ResourceManager("ClassLibrary1.Properties.Resources", assembly);
string[] strArrays15 = resourcemanager.GetString("JobList").Split('\n');
for (int row = 0; row < strArrays15.Length; row++)
{
columns = strArrays15[row].Split('\t');
// comboBoxEdit2.Items.Add(columns[1]);
coll.Add(columns[1]);
}
return;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
正如你所看到的,我只是加载了第二个单元格,意思是“盗贼”,“战斗机”等等...... 现在在SelectedIndexChanged我这样做:
private void comboBoxEdit2_SelectedIndexChanged(object sender, EventArgs e)
{
pictureEdit3.Image = new Bitmap(Application.StartupPath + "/jpg/" + columns[2].ToString() + ".jpg");
}
它不起作用,PictureBox图像只显示最后一行图像(无论我从我选择的ComboBox中选择什么项目,最后一行的图像显示所有情况)。
答案 0 :(得分:1)
代码中的变量columns
目前在for
循环的每次迭代中只保留一行。因此,每次for
循环完全执行时,columns
变量将仅保留最后处理的行,这就是您只获取最后一张图片的原因。在代码中执行for
循环后,columns
变量将保存此数据(对应于您文件中的最后一行):
columns[0] = "324"
columns[1] = "Overlord"
columns[2] = "common_mark_job_0045"
因此,每次调用SelectedIndexChanged
事件处理程序时,columns[2].ToString()
将始终返回"common_mark_job_0045"
。你想要的是这样的数据结构,这样你就可以为每一行检索正确的图像(而不仅仅是之前的最后一行):
// Columns of first row
columns[0][0] = "110"
columns[0][1] = "Champion"
columns[0][2] = "common_mark_job_0022"
// Columns of second row
columns[1][0] = "111"
columns[1][1] = "Archer"
columns[1][2] = "common_mark_job_0023"
要使代码有效,您应该保存文件中每行的列,如下所示:
string[][] columns;
...
string[] strArrays15 = resourcemanager.GetString("JobList").Split('\n');
columns = new string[strArrays15.Length][];
for (int row = 0; row < strArrays15.Length; row++)
{
columns[row] = strArrays15[row].Split('\t');
// comboBoxEdit2.Items.Add(columns[row][1]);
coll.Add(columns[row][1]);
}
然后,当用户更改组合框中的选定项目时,使用此事件处理程序检索正确的图像:
private void comboBoxEdit2_SelectedIndexChanged(object sender, EventArgs e)
{
pictureEdit3.Image = new Bitmap(Application.StartupPath + "/jpg/" +
columns[comboBoxEdit2.SelectedIndex][2].ToString() + ".jpg");
}