vue+element多選下拉框表格數據回顯

先看完成的圖片

1.首先就是基本框架,要多選必須在el-select中加multiple,filterable是可以搜索。

<div class="widget-body">
                            <div class="widget-main">
                                <template>
                                    <el-table v-loading="loading"
                                              :data="tableData.slice((pageIndex-1)*pageSize,pageIndex*pageSize)"
                                              stripe
                                              ref="multipleTable"
                                              style="width: 100%">
                                        <el-table-column fixed
                                                         type="index"
                                                         label="#"
                                                         width="50">
                                        </el-table-column>
                                        <el-table-column prop="STAFF_NUMBER"
                                                         label="工 號">
                                        </el-table-column>
                                        <el-table-column prop="USER_NAME"
                                                         label="姓 名">
                                        </el-table-column>
                                        <el-table-column prop="ABBREVIATION_NAME"
                                                         label="所在部門">
                                        </el-table-column>
                                        <el-table-column prop="options"
                                                         label="管轄部門">
                                            <template slot-scope="scope">
                                                <el-select v-model="scope.row.options" placeholder="請選擇" filterable multiple size="small">
                                                    <el-option v-for="item in ddlDept"
                                                               :key="item.Value"
                                                               :label="item.Text"
                                                               :value="item.Value">
                                                    </el-option>
                                                </el-select>
                                               
                                            </template>
                                        </el-table-column>
                                        <el-table-column align="center"
                                                         label="操作"
                                                         :key="8"
                                                         width="180">
                                            <template slot-scope="scope">
                                               
                                                <el-button size="mini"
                                                           type="primary"
                                                           icon="el-icon-success"
                                                           @*v-if="scope.row.show"*@
                                                           @@click="SaveRow(scope.row)">完成</el-button>
                                            </template>
                                        </el-table-column>
                                    </el-table>
                                    
                                    <!-- 分页 -->
                                    <el-pagination @@size-change="pageSizeChange"
                                                   @@current-change="pageIndexChange"
                                                   :current-page="pageIndex"
                                                   :page-sizes="[5, 10, 20, 50, 100]"
                                                   :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper"
                                                   :total="tableData.length">
                                    </el-pagination>
                                    <!-- /End 分页 -->
                                </template>

                            </div>
                        </div>
 data() {
                return {
                    loading: true,
                    // 表格
                    tableData: [],
                    ddlDept: [],
                    options: [],
                    show: false,
                    // 默认显示第几页
                    pageIndex: 1,
                    // 默认每页显示的条数(可修改)
                    pageSize: 10,
                }
            },
// 实例被挂载后调用
            mounted() {
                this.getTableData();
                this.formDept();
                //this.setDept();
                
            },

2.要回顯數據必須要查數據,已經選擇的數據存在options裡面,因為有多個,所以options必須是數組。ddlDept用來存放你的所有下拉框數據。

3.c#後端獲取下拉框數據,上面mounted裡面已經掛載下面的方法,所以頁面刷新就會調用下拉框選項。

 public class DDLResult
    {
        public string Value { get; set; }
        public string Text { get; set; }
    }
public ActionResult getID()
        {
            string sql = @"select ID,NAME from PEW_DEPARTMENT";
            DataTable dtTime = pew.ExcuteSql(sql, "IQCDB").ToDataSet().Tables[0];
            List<DDLResult> list = new List<DDLResult>();

            for (int i = 0; i < dtTime.Rows.Count; i++)
            {
                DDLResult group = new DDLResult();
                group.Value = dtTime.Rows[i]["ID"].ToString();
                group.Text = dtTime.Rows[i]["NAME "].ToString();
                list.Add(group);
            }
            return Json(list);
        }
formDept() {
                    // 发送 post 请求
                    this.$http.post('getID',
                        {
                        }
                    ).then(function (res) {
                        if (res.body.length != 0) {
                            this.ddlDept = res.body;
                            //console.log(this.ddlDept);
                        }
                    });
                },

4.獲取表格數據,因為後端傳過去的數據是個對象,所以我們在前端下拉框會收不到數據,需要取出它的id,注意options不要使用text,要用對象的value,一定要和ddlDept一樣,這樣就可以回顯出來,並且下拉框也會選擇上,如果使用text,只會回顯文字,下拉框沒有選擇。

public ActionResult getDept()
        {
            var msg = "";
            bool isSucceed = false;
            string strData = "";

            try
            {
                string staffnumber = "";
                DataTable dt_station = new DataTable();
                dt_station.Columns.Add("name", Type.GetType("System.String"));
                dt_station.Columns.Add("age", Type.GetType("System.String"));
                dt_station.Columns.Add("sex", Type.GetType("System.String"));
                dt_station.Columns.Add("GOVERNMENT", Type.GetType("System.String"));
                VisibleController visibleController = new VisibleController();
                
                string sql = @"select name,age,sex from user  ";
                DataTable dtTimes = pew.ExcuteSql(sql, "aaaa").ToDataSet().Tables[0];
                for (int j = 0; j < dtTimes.Rows.Count; j++)
                {
                    DataTable dt = new DataTable();
                    dt.Columns.Add("ID", Type.GetType("System.String"));
                    dt.Columns.Add("sex", Type.GetType("System.String"));
                    name= dtTimes.Rows[j]["name"].ToString();
                    string sql1 = @"select ID,sex from from user";
                    DataTable dtTime = pew.ExcuteSql(sql1, "aaaa").ToDataSet().Tables[0];
                    //string[] arr = new string[] { };
                    for (int i = 0; i < dtTime.Rows.Count; i++)
                    {
                        DataRow dtRows = dt.NewRow();
                        dtRows["ID"] = dtTime.Rows[i]["ID"].ToString();
                        dtRows["sex"] = dtTime.Rows[i]["sex"].ToString();

                        dt.Rows.Add(dtRows);
                        
                    }
                    string str = Newtonsoft.Json.JsonConvert.SerializeObject(dt);
                    DataRow dtRow = dt_station.NewRow();
                    dtRow["name"] = name;
                    dtRow["age"] = dtTimes.Rows[j]["age"].ToString();
                    dtRow["sex"] = dtTimes.Rows[j]["sex"].ToString();
                    dtRow["GOVERNMENT_DEPT"] = str;

                    dt_station.Rows.Add(dtRow);
                }
                strData = Newtonsoft.Json.JsonConvert.SerializeObject(dt_station);

                msg = "成功";
                isSucceed = true;
            }
            catch (Exception ex)
            {
                msg = "獲取數據異常" + ex;
                isSucceed = false;
            }
            DataResult result = new DataResult
            {
                IsSucceed = isSucceed,
                Result = strData,
                Message = msg,
                StatusCode = 0,
                Total = 0,
            };
            return Json(result);
        }
getTableData(page) {
                    // 回到第一頁
                    if (page == 1) {
                        this.pageIndex = 1
                    }
                    // 发送 post 请求
                    this.$http.post('getDept',
                        {
                            //staff: this.searchform.STAFF_NUMBER
                        }
                    ).then(function (res) {
                        if (res.body.IsSucceed) {
                            var data = JSON.parse(res.body.Result);
                            var arr = [];
                            if (data.length > 0) {
                                for (var i = 0; i < data.length; i++) {
                                    var obj = {};
                                    if (data[i].GOVERNMENT.length > 0) {
                                        var new_data = JSON.parse(data[i].GOVERNMENT);
                                        
                                        obj.name= data[i].name;
                                        obj.age= data[i].age;
                                        obj.sex= data[i].sex;
                                        var arr1 = [];
                                        for (var j = 0; j < new_data.length; j++) {
                                            arr1.push(new_data[j].id);
                                        }
                                        obj.options = arr1;
                                        arr.push(obj);
                                    }
                                }
                            }
                            this.tableData = arr;
                            this.loading = false;
                        } else {
                            this.loading = false;
//this.searchform.STAFF_NUMBER = "";
                        }
                        this.loading = false;
                    });
                },

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一个基于VueElement组件库的虚拟列表下框实现。在这个下框中,当列表项数量非常多时,只会渲染可视区域的部分,从而提高性能。 ```html <template> <el-select v-model="selected" placeholder="请选择" filterable remote :remote-method="loadOptions"> <template v-slot:default> <el-option v-for="item in visibleOptions" :key="item.value" :label="item.label" :value="item.value"></el-option> <el-option v-if="isLastPage" :key="'loading'" :label="'加载中...'" disabled></el-option> </template> </el-select> </template> <script> export default { data() { return { options: [], // 所有选项 visibleOptions: [], // 可见选项 selected: undefined, // 当前选中的值 pageSize: 10, // 每页显示的选项数量 currentPage: 1, // 当前页码 isLastPage: false // 是否已经加载完所有选项 }; }, methods: { async loadOptions(query) { // 模拟异步加载数据 await new Promise(resolve => setTimeout(resolve, 1000)); // 这里可以根据query参数从服务器获取数据 const data = Array.from({ length: 10000 }, (_, i) => ({ label: `选项${i + 1}`, value: i + 1 })); // 如果没有更多数据了,则标记为最后一页 if (data.length < this.pageSize) { this.isLastPage = true; } // 将新数据合并到原有数据中 this.options = this.options.concat(data); // 更新可见选项 this.updateVisibleOptions(query); }, updateVisibleOptions(query) { const start = (this.currentPage - 1) * this.pageSize; const end = start + this.pageSize; this.visibleOptions = this.options.slice(start, end); // 如果没有匹配的选项,则跳转到第一页 if (query && this.visibleOptions.every(item => !item.label.includes(query))) { this.currentPage = 1; this.updateVisibleOptions(query); } } }, watch: { currentPage() { // 每次切换页码时更新可见选项 this.updateVisibleOptions(); } } }; </script> ``` 在这个实现中,我们使用了`el-select`组件来实现下框,设置了`filterable`和`remote`属性来启用搜索和异步加载功能。每当用户输入查询关键字时,`loadOptions`方法就会被调用,该方法会模拟异步加载数据,并将新数据合并到`options`列表中。同时,根据当前页码和每页显示的选项数量,计算出可见选项的范围,并将其赋值给`visibleOptions`属性。如果没有匹配的选项,则跳转到第一页。如果已经加载完所有选项,则将`isLastPage`属性标记为`true`,以便在可见选项列表中显示“加载中...”的提示。用户每次滚动列表时,会触发`loadOptions`方法,从而实现虚拟滚动的效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值