V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
buxiugangpen
V2EX  ›  C#

初学者咨询一个 C#的问题,求大佬解答啊

  •  
  •   buxiugangpen · 355 天前 · 2008 次点击
    这是一个创建于 355 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我需要创建一个结构体
    struct jiegouti
    {
    public string data_bj;
    public string data_bx;
    public string data_tx;
    public string data_ty;
    }
    现在想根据页面数据的数量来自动创建多个结构体,比如
    jiegouti jgt1;
    jiegouti jgt2;
    jiegouti jgt3;
    jiegouti jgt4;

    这些结构体要获取类似的控件数据
    比如下面的
    jgt1.data_bj = txbox_bj1.Text;
    jgt1.data_bx = txbox_bx1.Text;
    jgt1.data_tx = txbox_tx1.Text;
    jgt1.data_ty = txbox_ty1.Text;

    jgt2.data_bj = txbox_bj2.Text;
    jgt2.data_bx = txbox_bx2.Text;
    jgt2.data_tx = txbox_tx2.Text;
    jgt2.data_ty = txbox_ty2.Text;

    我现在想要写个循环,来根据页面的数量自动创建结构体,并且获取每个结构体字段下面的控件数值,应该怎么写,我写出来的结构体中的局部变量都变成字符串了,,
    我的大概写法,如下,求大佬帮忙看看咋弄。
    for(int j=1;j<=6;j++){
    $["jgt"+j].data_bj = $["txbox_bj"+j].Text
    }
    25 条回复    2023-05-10 10:35:29 +08:00
    Rocketer
        1
    Rocketer  
       355 天前 via iPhone
    动态变量名?那你得用反射了。

    数组不行吗?为什么非得动态变量名?
    buxiugangpen
        2
    buxiugangpen  
    OP
       355 天前
    @Rocketer 大佬,反射咋用,还没搞会反射啊,,,,数组应该是可以的,因为我刚学到结构体,所以想试试用结构体来写这个小功能。。。
    csrocks
        3
    csrocks  
       355 天前
    var dict = new ..<string, struct>();
    for(..){
    var s = new struct;
    s.xx=xx;
    dict.add(name, s);
    }
    buxiugangpen
        4
    buxiugangpen  
    OP
       355 天前
    @csrocks 大佬好,大佬,我没看懂,有注释没
    reallittoma
        5
    reallittoma  
       355 天前
    $["jgt"+j]这是什么写法?我咋看不懂 C#了……
    apie
        6
    apie  
       355 天前
    能上 v2 应该能找到免费 chat-gpt 吧,这种问题,最适合用 chat-gpt 来解决了,一方面你可以锻炼自己描述问题的能力,另一方面,能够给你及时和针对性的反馈。不是说群友回答得不好,而是这样效率太低了。
    buxiugangpen
        7
    buxiugangpen  
    OP
       355 天前
    @reallittoma 这样写变 string 了,拼接变量的
    buxiugangpen
        8
    buxiugangpen  
    OP
       355 天前
    @apie 1 块钱一个月的 vpn ,ip 不稳定,chat-gpt 基本上没成功过,,,挨~!~
    buxiugangpen
        9
    buxiugangpen  
    OP
       355 天前
    @reallittoma 拼接字符串,不是变量。。。。
    wu00
        10
    wu00  
       355 天前   ❤️ 1
    描述的一塌糊涂,确实是个初学者;
    感觉要的是这个:
    UI 界面动态添加出行人[姓名、手机号...],提交时拿到所有出行人对象

    ```
    var jiegoutis = new List<jiegouti>();
    foreach(var container in containers)
    {
    jiegoutis.Add(new jiegouti
    {
    data_bj = container.txbox_bj.Text;
    data_bx = container.txbox_bx.Text;
    ...
    })
    }
    ```
    TiggeYL
        11
    TiggeYL  
       355 天前
    建议用数组( Array )、枚举(继承 IEnumerable 的 比如 List<T>)或者字典( Dictionary<string,T>),
    T 是泛型
    unclejock
        12
    unclejock  
       355 天前
    花几十块钱开个 vpn 吧...
    buxiugangpen
        13
    buxiugangpen  
    OP
       355 天前
    @wu00 多谢大佬,我试试,这个勉强能看明白
    buxiugangpen
        14
    buxiugangpen  
    OP
       355 天前
    @unclejock 大佬,推荐个,我现在花了 20 多,买了两年多的这个一块的 vpn
    buxiugangpen
        15
    buxiugangpen  
    OP
       355 天前
    @TiggeYL 我都试试看看那个效率高,,反射我也研究下,反正也不是啥着急的功能,有的是时间
    unclejock
        16
    unclejock  
       355 天前
    @buxiugangpen
    v:cmF5c2VhcmNoZXI=
    kop1989smurf
        17
    kop1989smurf  
       355 天前
    动态生成、调用变量:用反射。

    但一般情况下,UI 的呈现逻辑是不需要反射的,除非你用错了组件的使用方式。
    比如你靠 button 、label 去呈现列表数据。
    buxiugangpen
        18
    buxiugangpen  
    OP
       355 天前
    @kop1989smurf 大佬,,,我用的是 textbox ,,现在 textbox 的名字不知道怎么弄到循环里,,,比如 a1= textbox1.text a2= textbox2.text a3= textbox3.text 怎么 textbox+数字 这个就不知道怎么弄了
    kop1989smurf
        19
    kop1989smurf  
       355 天前
    @buxiugangpen 从你描述的情境下来看,你只需要遍历某 panel 下的 textbox 组件就可以了,并不需要反射。
    搜索关键词:winform 遍历组件
    例如这篇文章: https://www.cnblogs.com/winformasp/articles/11865326.html
    buxiugangpen
        20
    buxiugangpen  
    OP
       354 天前
    @kop1989smurf 是想遍历,但是因为 textbox 的数量不确定,还有时间的控件,主要是想学一下,控件名称怎么拼接,拼接后还能调用控件的属性
    ybs123
        21
    ybs123  
       354 天前
    你可以使用一个列表来保存你的结构体,这样就可以根据页面数据的数量动态创建结构体了。在循环中,你可以使用循环变量来拼接控件名称,并使用 FindControl 方法来获取控件对象,然后根据需要对结构体进行赋值。

    示例代码如下:
    ```
    int n = 4; // 页面数据的数量
    List<jiegouti> jgtList = new List<jiegouti>(); // 声明一个列表来保存结构体

    // 循环创建结构体并给字段赋值
    for (int i = 1; i <= n; i++)
    {
    jiegouti jgt = new jiegouti();
    jgt.data_bj = ((TextBox)FindControl("txbox_bj" + i.ToString())).Text;
    jgt.data_bx = ((TextBox)FindControl("txbox_bx" + i.ToString())).Text;
    jgt.data_tx = ((TextBox)FindControl("txbox_tx" + i.ToString())).Text;
    jgt.data_ty = ((TextBox)FindControl("txbox_ty" + i.ToString())).Text;
    jgtList.Add(jgt); // 将结构体添加到列表中
    }
    ```

    在循环中,我们使用了 FindControl 方法来查找页面上的控件。该方法会返回一个控件对象,因此我们不需要再使用索引 0 来获取控件对象,然后再将其转换为 TextBox 来获取其值。

    我们将每个结构体对象添加到列表中,这样列表中就包含了全部的结构体对象。你可以通过遍历这个列表来获取每个结构体对象及其包含的字段值。
    ybs123
        22
    ybs123  
       354 天前
    获取当前页面上的所有 TextBox 控件数量

    int count = this.Controls.OfType<TextBox>().Count();
    buxiugangpen
        23
    buxiugangpen  
    OP
       354 天前
    @ybs123 大佬,我试试了下,但是提示 FindControl 不存在,,,不知道为啥
    ybs123
        24
    ybs123  
       354 天前
    @buxiugangpen 至少三四种方式获取,你自己可以百度搜索下,我举个例子
    this.Controls.OfType<TextBox>().Where(c =>c.Name==拼接的控件名).FirstOrDefault()?.Text??"";
    buxiugangpen
        25
    buxiugangpen  
    OP
       353 天前
    @ybs123 多谢大佬,我写了个 FindControl 方法,返回 this.Controls.OfType<TextBox>().SingleOrDefault(c => c.Name == name) 然后用 ((TextBox)FindControl("txbox_bj" + i.ToString())).Text;解决了变量名带参数的问题,多谢大佬,,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2683 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 11:13 · PVG 19:13 · LAX 04:13 · JFK 07:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.