来自另一个类的列表框计数项目始终返回 0

Posted

技术标签:

【中文标题】来自另一个类的列表框计数项目始终返回 0【英文标题】:listbox count items from another class returns always 0 【发布时间】:2012-11-28 23:35:56 【问题描述】:
            Frm Form1 = new Frm();
                //here I always get the count =0
            if (Form1 .listBox2 .SelectedItems .Count  > 0)
            
                string item;
                foreach (int i in Form1.listBox2.SelectedIndices)
                
                    item = Form1.listBox2.Items[i].ToString();

当我在 Frm 中执行相同操作时,我会得到所选项目的实际数量,这是 Frm 中的代码

    public  void btnPostText_Click(object sender, EventArgs e)
    
        listBox2.ClearSelected();
        if (listBox1.SelectedItems.Count > 0)
        
            foreach (int index in listBox1.SelectedIndices)
                listBox2.SetSelected(index, true);
        

从我的程序中,我尝试在登录过程后同时在 facebook 上发布多个组,用户在 listBox2 中的 litBox1 选择他/她想要发布到的组名称,组 id( s) 以相同的顺序,因此当用户单击 btnPostText 时,我将选择从 listBox1 移动到 listBox2' ,,,现在在 Class2 中,我想知道是否在 listBox2 中选择了任何项目,第一个代码在 Class2 中。 PostImg public static bool PostImg( , , ,)

Class2 包含 post 过程,就像 Postimg 一样,如果已发布则返回 true,否则返回 false

这里我用 Frm 来称呼它

  if (Class2.PostImage(AppSettings.Default.AccessToken, textbox1.Text, textboxpic.Text) == true)
                MessageBox.Show("Post Done");

Class2中的代码是

    public static bool PostImage(string AccessToken, string Status, string ImagePath) 
    
        try
        
            Frm Frm = new Frm();

            if (Frm .listBox2 .SelectedItems .Count  > 0)
            
                string item;
                foreach (int i in Frm.listBox2.SelectedIndices)
                
                    item = Frm.listBox2.Items[i].ToString();
                    groupid = item;


                    FacebookClient fbpost = new FacebookClient(AccessToken);
                    var imgstream = File.OpenRead(ImagePath);
                    dynamic res = fbpost.Post("/" + groupid + "/photos", new
                   
                       message = Status,
                       File = new FacebookMediaStream
                       

                           ContentType = "image/jpg",
                           FileName = Path.GetFileName(ImagePath)
                       .SetValue(imgstream)

                   );

                    result = true;

                
            
            return result;
        
        catch (Exception ex)
        
            System.Windows.Forms.MessageBox.Show(ex.Message);
            return false;
        

【问题讨论】:

listbox2 是如何填充的?在我看来,您正在制作 Frm 的 new 实例,因此其中的 listbox2 仍然是空的。 所以我需要用其他班级的相同物品重新填充它??? 可能是用户在选择了框中的某些项目后单击了 btnPostText。您的第一个示例位于哪个班级?也许您需要获取对 Frm 已打开实例的引用,而不是创建新实例。 @ميداني حر 否。您需要获取对您需要的实际 Frm 实例的引用。在这里,您正在创建一个新的。 我有 2 个课程 FrmClass2 第一个例子在 Frm 【参考方案1】:

首先,一些基础知识。 Class2Frm 是两个不同的类。 通常除非您在它们之间传递引用,否则它们无法看到彼此。

Frm 可以看到 Class2 中的 PostImage 方法,因为它被标记为 static。但事实并非如此。所以在调用PostImage 时需要传递对Frm 的引用。最简单的方法是将其包含在方法签名中:

public static bool PostImage(string AccessToken, string Status, string ImagePath, Frm MyForm) 

现在你叫它:

if (Class2.PostImage(AppSettings.Default.AccessToken, textbox1.Text, textboxpic.Text, this) == true)

请注意我们如何将this 作为参数传递给函数。这是我们将在PostImage 中使用的引用:

if (MyForm.listBox2.SelectedItems .Count  > 0)

等等等等。变量 MyForm 现在是对名为 Class2.PostImage 的表单的引用。

【讨论】:

【参考方案2】:

那么您应该将对表单(或列表框)的引用作为PostImg 方法的参数传递。

public static bool PostImg(Frm form, string AccessToken, string Status, string ImagePath )

    try
    
        if (form.listBox2.SelectedItems.Count  > 0)
        
            string item;
            foreach (int i in form.listBox2.SelectedIndices)
            
                item = form.listBox2.Items[i].ToString();
                groupid = item;


                FacebookClient fbpost = new FacebookClient(AccessToken);
                var imgstream = File.OpenRead(ImagePath);
                dynamic res = fbpost.Post("/" + groupid + "/photos", new
               
                   message = Status,
                   File = new FacebookMediaStream
                   

                       ContentType = "image/jpg",
                       FileName = Path.GetFileName(ImagePath)
                   .SetValue(imgstream)

               );

                result = true;

            
        
        return result;
    
    catch (Exception ex)
    
        System.Windows.Forms.MessageBox.Show(ex.Message);
        return false;
    

然后从表单中的方法调用它,如下所示:

if (Class2.PostImage(this, AppSettings.Default.AccessToken, textbox1.Text, textboxpic.Text) == true)
                MessageBox.Show("Post Done");

【讨论】:

Class2.PostImg(what should I pass here,accesstoken,text,text); 如果您从表单的方法调用,则调用位于答案的末尾。

以上是关于来自另一个类的列表框计数项目始终返回 0的主要内容,如果未能解决你的问题,请参考以下文章

将过滤器列表应用于来自使用 pandas 的列表的数据框

Excel VBA - 如何从另一个控件触发列表框单击

访问列表框,包括来自文本框的信息

QT:来自多个旋转框的项目列表

选择列表框项目时,在另一个列表框中显示相关数据

当返回的列表长度与数据框列数相同时,应用 + 列表推导会给出 ValueError