表单控件未更新

狙击

成员
已加入
2012年1月25日
留言内容
7
编程经验
3-5
大家好,我遇到了一个奇怪的问题:
我在#Develop中创建了一个表单,如下所示:
10x4ojs.png


如您所见,那里有一个listView。我的目标是从文件加载内容并将其显示到该列表视图中。我这样做是没有错误或消息的,然后在其中包含所有数据的情况下创建了一个新的列表视图,但是当我替换它时,什么也没发生。它是加载并创建新listView之后的表单:
723x1y.png



这是管理窗口的代码:
C#:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace FeedMe
{
 public partial class Manage : Form
 {
  public Manage()
  {    
   InitializeComponent();
  }
  
  void ManageLoad(object sender, EventArgs e)
  {      
   this.listView = new Utility().getFeedList();
   this.Refresh();
   this.Update();
  }
  
  void Button3Click(object sender, EventArgs e)
  {
   // save, then
   this.Close();
  }
 }
}

启动时会调用ManageLoad函数,我已经对其进行了测试,并且在打开表单时确实会执行该函数。 getFeedList函数如下:
C#:
StreamReader sr = new StreamReader(Stream.Null);
  ListView listView = new ListView();
  int feedCount = 0;
  
  string[] feedNames = new string[feedCount+1];
  string[] feedLinks = new string[feedCount+1];
  string[] feedImgs = new string[feedCount+1];
  
  try{
   sr = new StreamReader(".\\resources\\feeds.cfg");
  } catch (Exception e) {
   MessageBox.Show("Could not open feeds.cfg. Please make sure that it is available. You can create a new one using Feeds > Manage");
   new Logger().write("Could not open feeds.cfg: "+e.ToString());
   return new ListView();
  }
  
  string line = string.Empty;
  
  while((line = sr.ReadLine()) != null)
  {
   try{
    string newFeedName = line.Substring(0, line.IndexOf(' '));
    line = line.Substring(line.IndexOf(' ')+1);
    
    string newFeedLink = line.Substring(0, line.IndexOf(' '));
    line = line.Substring(line.IndexOf(' ')+1);
    
    string newFeedImg = line;
    
    try{
     feedNames[feedCount] = newFeedName;
     feedLinks[feedCount] = newFeedLink;
     feedImgs[feedCount] = newFeedImg;
     
     feedCount++;
     
     string[] new_feedNames = new string[feedCount+1];
     string[] new_feedLinks = new string[feedCount+1];
     string[] new_feedImgs = new string[feedCount+1];
     
     feedNames = new_feedNames;
     feedLinks = new_feedLinks;
     feedImgs = new_feedImgs;
    } catch (Exception e) {
     new Logger().write("Exception while adding to feeds: "+e.ToString());
    }
   } catch (Exception e) {
    MessageBox.Show("Corrupt line in feed list. Please create a new one using Feeds > Manage");
    new Logger().write("Error with line '"+line+"':"+e.ToString());
   }
  }
  
  ColumnHeader feedNameHeader = new ColumnHeader();
  ColumnHeader feedLinkHeader = new ColumnHeader();
  ColumnHeader feedImgHeader = new ColumnHeader();
  
  feedNameHeader.Text = "Name";
  feedNameHeader.Width = 150;
  
  feedLinkHeader.Text = "URL";
  feedLinkHeader.Width = 300;
  
  feedImgHeader.Text = "Image";
  feedImgHeader.Width = 100;
  
  listView.Columns.Add(feedNameHeader);
  listView.Columns.Add(feedLinkHeader);
  listView.Columns.Add(feedImgHeader);
  
  for(int c = 0; c < feedCount; c++)
  {
   ListViewItem item = new ListViewItem(feedNames[c]);
   item.SubItems.Add(feedLinks[c]);
   item.SubItems.Add(feedImgs[c]);
   
   listView.Items.Add(item);
  }
  
  return listView;

我在想,即使我无法加载数据,列标题仍会显示出来。为什么它没有改变的任何想法?我也没有弹出任何消息框,因此它没有遇到任何障碍。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
最好将ListView传递给方法并填充它:
new Utility().getFeedList(this.listView);

如果没有其他实例依赖关系,请将其设为静态(用法表明如此),则调用将是:
公用事业.getFeedList(this.listView);

如果您想知道设计者生成的代码如何设法将控件添加到表单中,可以查看InitializeComponent方法中的代码。

这些天如何发展?别以为我可能从v1或2开始就尝试过它,而那时对VS Express来说还很短。
 

狙击

成员
已加入
2012年1月25日
留言内容
7
编程经验
3-5
#Develop非常不错。完全没有问题,它只有大约50 MB,并且也有VB,所以我对此感到非常满意。

我尝试了您所说的所有内容,但遗憾的是仍然没有更新。 :/反复尝试将其更改为Utility.getFeedList(listView),但出现错误,因此我只创建了Utility的一个实例,并在完成后将其设置为null。
Manage.cs:
C#:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace FeedMe
{
 public partial class Manage : Form
 {
  public Manage()
  {    
   InitializeComponent();
  }
  
  void ManageLoad(object sender, EventArgs e)
  {      
   Utility util = new Utility();
   
   this.listView = util.getFeedList(listView);
   this.Refresh();
   this.Update();
   
   util = null;
  }
  
  void Button3Click(object sender, EventArgs e)
  {
   // save, then
   this.Close();
  }
 }
}

公用事业
C#:
public ListView getFeedList(ListView listView)
  {
   StreamReader sr = new StreamReader(Stream.Null);
   int feedCount = 0;
   
   string[] feedNames = new string[feedCount+1];
   string[] feedLinks = new string[feedCount+1];
   string[] feedImgs = new string[feedCount+1];
   
   try{
    sr = new StreamReader(".\\resources\\feeds.cfg");
   } catch (Exception e) {
    MessageBox.Show("Could not open feeds.cfg. Please make sure that it is available. You can create a new one using Feeds > Manage");
    new Logger().write("Could not open feeds.cfg: "+e.ToString());
    return listView;
   }
   
   string line = string.Empty;
   
   while((line = sr.ReadLine()) != null)
   {
    try{
     string newFeedName = line.Substring(0, line.IndexOf(' '));
     line = line.Substring(line.IndexOf(' ')+1);
     
     string newFeedLink = line.Substring(0, line.IndexOf(' '));
     line = line.Substring(line.IndexOf(' ')+1);
     
     string newFeedImg = line;
     
     try{
      feedNames[feedCount] = newFeedName;
      feedLinks[feedCount] = newFeedLink;
      feedImgs[feedCount] = newFeedImg;
      
      feedCount++;
      
      string[] new_feedNames = new string[feedCount+1];
      string[] new_feedLinks = new string[feedCount+1];
      string[] new_feedImgs = new string[feedCount+1];
      
      feedNames = new_feedNames;
      feedLinks = new_feedLinks;
      feedImgs = new_feedImgs;
     } catch (Exception e) {
      new Logger().write("Exception while adding to feeds: "+e.ToString());
     }
    } catch (Exception e) {
     MessageBox.Show("Corrupt line in feed list. Please create a new one using Feeds > Manage");
     new Logger().write("Error with line '"+line+"':"+e.ToString());
    }
   }
   
   ColumnHeader feedNameHeader = new ColumnHeader();
   ColumnHeader feedLinkHeader = new ColumnHeader();
   ColumnHeader feedImgHeader = new ColumnHeader();
   
   feedNameHeader.Text = "Name";
   feedNameHeader.Width = 150;
   
   feedLinkHeader.Text = "URL";
   feedLinkHeader.Width = 300;
   
   feedImgHeader.Text = "Image";
   feedImgHeader.Width = 100;
   
   listView.Columns.Add(feedNameHeader);
   listView.Columns.Add(feedLinkHeader);
   listView.Columns.Add(feedImgHeader);
   
   for(int c = 0; c < feedCount; c++)
   {
    ListViewItem item = new ListViewItem(feedNames[c]);
    item.SubItems.Add(feedLinks[c]);
    item.SubItems.Add(feedImgs[c]);
    
    listView.Items.Add(item);
   }
   
   return listView;
  }

另外,这是设计师。不知道这里是否有任何您可能需要查看的内容:
C#:
/*
 * Created by SharpDevelop.
 * User: MURPHYC1
 * Date: 1/24/2012
 * Time: 7:28 PM
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
namespace FeedMe
{
 partial class Manage
 {
  /// <summary>
  /// Designer variable used to keep track of non-visual components.
  /// </summary>
  private System.ComponentModel.IContainer components = null;
  
  /// <summary>
  /// Disposes resources used by the form.
  /// </summary>
  /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  protected override void Dispose(bool disposing)
  {
   if (disposing) {
    if (components != null) {
     components.Dispose();
    }
   }
   base.Dispose(disposing);
  }
  
  /// <summary>
  /// This method is required for Windows Forms designer support.
  /// Do not change the method contents inside the source code editor. The Forms designer might
  /// not be able to load this method if it was changed manually.
  /// </summary>
  private void InitializeComponent()
  {
   System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Manage));
   this.listView = new System.Windows.Forms.ListView();
   this.button1 = new System.Windows.Forms.Button();
   this.button2 = new System.Windows.Forms.Button();
   this.button3 = new System.Windows.Forms.Button();
   this.SuspendLayout();
   // 
   // listView
   // 
   this.listView.LabelEdit = true;
   this.listView.Location = new System.Drawing.Point(12, 12);
   this.listView.Name = "listView";
   this.listView.Size = new System.Drawing.Size(550, 270);
   this.listView.TabIndex = 0;
   this.listView.UseCompatibleStateImageBehavior = false;
   // 
   // button1
   // 
   this.button1.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
   this.button1.Location = new System.Drawing.Point(12, 295);
   this.button1.Name = "button1";
   this.button1.Size = new System.Drawing.Size(75, 23);
   this.button1.TabIndex = 2;
   this.button1.Text = "Add";
   this.button1.UseVisualStyleBackColor = true;
   // 
   // button2
   // 
   this.button2.Location = new System.Drawing.Point(93, 295);
   this.button2.Name = "button2";
   this.button2.Size = new System.Drawing.Size(75, 23);
   this.button2.TabIndex = 3;
   this.button2.Text = "Remove";
   this.button2.UseVisualStyleBackColor = true;
   // 
   // button3
   // 
   this.button3.Location = new System.Drawing.Point(487, 295);
   this.button3.Name = "button3";
   this.button3.Size = new System.Drawing.Size(75, 23);
   this.button3.TabIndex = 4;
   this.button3.Text = "Save";
   this.button3.UseVisualStyleBackColor = true;
   this.button3.Click += new System.EventHandler(this.Button3Click);
   // 
   // Manage
   // 
   this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
   this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
   this.ClientSize = new System.Drawing.Size(577, 330);
   this.Controls.Add(this.button3);
   this.Controls.Add(this.button2);
   this.Controls.Add(this.button1);
   this.Controls.Add(this.listView);
   this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
   this.MaximizeBox = false;
   this.Name = "Manage";
   this.Text = "Manage Feeds";
   this.TopMost = true;
   this.Load += new System.EventHandler(this.ManageLoad);
   this.ResumeLayout(false);
  }
  private System.Windows.Forms.ListView listView;
  private System.Windows.Forms.Button button3;
  private System.Windows.Forms.Button button2;
  private System.Windows.Forms.Button button1;
 }
}
 
Last edited:

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
public static void getFeedList(ListView listView)
 

狙击

成员
已加入
2012年1月25日
留言内容
7
编程经验
3-5
我知道了!花了我一些时间,但经过一些随机调整后,事实证明我将视图类型设置为ImageLarge,而没有 细节 这显然是我想要做的事情所需要的。现在将显示这些列。再进行一些调整,就可以将数据保存在那里。

感谢你的帮助。在理解静态/非静态变量方面,我仍然是一个菜鸟,但我仍有很多东西要学习 :)
哦,您对我的编码风格还有其他意见吗?我总是想知道它是好是坏。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
到目前为止,它并没有太多关注,但是您应该看的一件事是使用xml代替cfg字符串进行数据存储。
这三行都是毫无意义的:
   this.Refresh();
   this.Update();   
   util = null;

局部变量util及其实例不是必需的,但如果是,它将在那时超出范围。
Update和Refresh是图形操作,两者在此处均无关。

'button1 / button2 / button3'-给他们起一个明智的名字,也可以用'listView'来称呼。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
#Develop非常不错。完全没有问题,它只有大约50 MB,并且也有VB,所以我对此感到非常满意。
我有一天会尝试使用最新版本,目前正在将VS Express用于VB和C#。我记得我喜欢在SharpDevelop中为这些语言进行集成的代码转换,这是在在线转换器出现之前,如今对我而言,这并不是那么重要的功能。
 
最佳 底部