在项目加载的时候往listbox1里添加了checkbox,listbox2添加了textbox,如下:
 for (int i = 0; i < tbl.Rows.Count; i++)
            {
                CheckBox ckbids= new CheckBox();
                ckbids.Name = "ckbIDS" + i.ToString();
                ckbids.Height = 20;
                ckbids.HorizontalAlignment = HorizontalAlignment.Stretch;
                ckbids.Content = tbl.Rows[i]["ids_name"].ToString();
                this.listbox1.Items.Add(ckbids);                TextBox txtIDSNum = new TextBox();
                txtIDSNum.Name = "txtIDSNum" + i.ToString();
                txtIDSNum.Width = 100;
                txtIDSNum.Height = 20;
                txtIDSNum.ToolTip = tbl.Rows[i]["ids_name"].ToString(); 
                //txtIDSNum.Content = i.ToString();
                this.listbox2.Items.Add(txtIDSNum);
            }
在保存的时候,我试图通过选定的checkbox获取textbox的值,应为是很多个动态生成的,我用了findname方法,如下:
         foreach (CheckBox ckb in listbox1.Items)
            {
                if (ckb.IsChecked == true)
                {
                    string txtIDSNum ="txtIDSNum"+ ckb.Name.Replace("ckbIDS", "");
                    string test1 = ((TextBox)this.lstIDSNum.FindName("txtIDSNum2")).Text.Trim();
                    string test2 = ((TextBox)this.FindName(txtIDSNum)).Text.Trim();
                    if (((TextBox)lstIDSNum.FindName(txtIDSNum)).Text.Trim() == null)
                    {
                        msg.TipMsg("IDS的序号不能为空,请您输入!", "提示");
                        return;
                    }
                    idsNum++;
                }
            }
因为在其他地方用同样的方法有没有出现问题,但是这里老有问题,执行if (((TextBox)lstIDSNum.FindName(txtIDSNum)).Text.Trim() == null)时总提示
Object reference not set to an instance of an object,我以为是控件的名称弄错了,用test1测试同样出错,不知为何,恳请高手指教。

解决方案 »

  1.   

    今天把测试语句分开了:
      object obj=this.FindName(txtIDSNum);
      TextBox txt=obj as TextBox;
      string str=txt.Text;
    结果就在最后一句出错了,但是我的text里面有值啊,却提示没有实例化,不知何故?
      

  2.   

    经过调试,发现在调用findname方法后,obj得到的是null,难道后台用代码创建的控件时不能用findname方法获取的?
      

  3.   

    Try like this
    TextBox tb = LogicalTreeHelper.FindLogicalNode(this.listbox2, "txtIDSNum0") as TextBox;
    Orstring test1 = FindChildByName<TextBox>(this.listbox2,"txtIDSNum0").Text.Trim();public T FindChildByName<T>(FrameworkElement parent, string name) where T : FrameworkElement
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            FrameworkElement child = VisualTreeHelper.GetChild(parent, i) as FrameworkElement;
            if (child != null &&
                child is T && 
                string.Equals(name, child.Name))
                return (T)child;
            else
            {
                T childOfChild = FindChildByName<T>(child, name);
                if (childOfChild != null)
                    return childOfChild;
            }
        }
        return null;
    }
    Hope this helps