精华内容
下载资源
问答
  • Android:控件GridView使用

    万次阅读 多人点赞 2018-06-05 23:17:16
    如果是列表(单列多行形式)的使用ListView,如果是多行多列网状形式的优先使用GridView。 <?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android=...

    如果是列表(单列多行形式)的使用ListView,如果是多行多列网状形式的优先使用GridView。

    <?xml version="1.0" encoding="utf-8"?>
    <GridView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
    <!-- android:horizontalSpacing="10dp"水平拮据 -->
      <!-- android:verticalSpacing="10dp"垂直拮据 -->
        
    </GridView>

    GirdView的一些属性:

    android:numColumns="auto_fit" --------列数设置为自动
    android:columnWidth="90dp",----------每列的宽度,也就是Item的宽度
    android:stretchMode="columnWidth"------缩放与列宽大小同步
    android:verticalSpacing="10dp"----------垂直边距
    android:horizontalSpacing="10dp"-------水平边距

    1、准备数据源

    2、新建适配器

    3、加载适配器

    GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的,下面来个实例,

    下载实例>>>

    效果图:

    MainActivity.java

    package com.example.testgridview;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.GridView;
    import android.widget.SimpleAdapter;
    
    public class MainActivity extends Activity {
        private GridView gview;
        private List<Map<String, Object>> data_list;
        private SimpleAdapter sim_adapter;
        // 图片封装为一个数组
        private int[] icon = { R.drawable.address_book, R.drawable.calendar,
                R.drawable.camera, R.drawable.clock, R.drawable.games_control,
                R.drawable.messenger, R.drawable.ringtone, R.drawable.settings,
                R.drawable.speech_balloon, R.drawable.weather, R.drawable.world,
                R.drawable.youtube };
        private String[] iconName = { "通讯录", "日历", "照相机", "时钟", "游戏", "短信", "铃声",
                "设置", "语音", "天气", "浏览器", "视频" };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.test);
            gview = (GridView) findViewById(R.id.gview);
            //新建List
            data_list = new ArrayList<Map<String, Object>>();
            //获取数据
            getData();
            //新建适配器
            String [] from ={"image","text"};
            int [] to = {R.id.image,R.id.text};
            sim_adapter = new SimpleAdapter(this, data_list, R.layout.item, from, to);
            //配置适配器
            gview.setAdapter(sim_adapter);
        }
    
        
        
        public List<Map<String, Object>> getData(){        
            //cion和iconName的长度是相同的,这里任选其一都可以
            for(int i=0;i<icon.length;i++){
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("image", icon[i]);
                map.put("text", iconName[i]);
                data_list.add(map);
            }
                
            return data_list;
        }
        
    
    }

    test.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" 
        android:background="#000"
        >
        
    <GridView 
            android:id="@+id/gview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:numColumns="auto_fit"    
            android:columnWidth="80dp"
            android:stretchMode="columnWidth"
            ></GridView>
    </LinearLayout>

    item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:gravity="center"
        android:padding="10dp"
        >
        
        
    <ImageView 
        android:src="@drawable/ic_launcher"
        android:id="@+id/image"
        android:layout_width="60dp"
        android:layout_height="60dp"
        
        />
    
    <TextView 
        android:id="@+id/text"
        android:layout_marginTop="5dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ffffff"
        android:text="文字"
        />
    </LinearLayout>

    概述

    GridView是Android的另一个列表容器,用法也跟ListView类似,它的布局是一个网格,一行可以有多个项,并且整个视图可以滚动,我们常见的应用有手机中的图库、launcher里面的应用列表、类似微信多张图片等,总的来说,ListView主要应用于单列多行的列表,然而GridView主要应用于多行多列的网状布局。

    案例

    GridView

    GridView

    上面的运行结果就是GridView的典型效果,每个item是一张固定大小的图片,这里让它自适应屏幕来填充完整个屏幕的宽度。

    实现过程

    GridView布局
    layout/activity_gridview.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
    
        <GridView
            android:id="@+id/gridView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:columnWidth="90dp"
            android:numColumns="auto_fit"
            android:verticalSpacing="10dp"
            android:horizontalSpacing="10dp"
            android:stretchMode="columnWidth"
            android:cacheColorHint="#00000000"
            android:listSelector="#00000000"
            android:scrollbars="none"
            android:fadeScrollbars="true"
            android:fastScrollEnabled="true"
            android:fadingEdge="none"
            android:fadingEdgeLength="10dp"
            android:stackFromBottom="true"
            android:transcriptMode="alwaysScroll"
            android:drawSelectorOnTop="false"
            android:gravity="center"/>
    </LinearLayout>
    

    相关属性解析:
    1.android:numColumns=”auto_fit” //GridView的列数设置为自动
    2.android:columnWidth=”90dp " //每列的宽度,也就是Item的宽度
    3.android:stretchMode=”columnWidth"//缩放与列宽大小同步
    4.android:verticalSpacing=”10dp” //两行之间的边距
    5.android:horizontalSpacing=”10dp” //两列之间的边距
    6.android:cacheColorHint="#00000000" //去除拖动时默认的黑色背景
    7.android:listSelector="#00000000" //去除选中时的黄色底色
    8.android:scrollbars="none" //隐藏GridView的滚动条
    9.android:fadeScrollbars="true" //设置为true就可以实现滚动条的自动隐藏和显示
    10.android:fastScrollEnabled="true" //GridView出现快速滚动的按钮(至少滚动4页才会显示)
    11.android:fadingEdge="none" //GridView衰落(褪去)边缘颜色为空,缺省值是vertical。(可以理解为上下边缘的提示色)
    12.android:fadingEdgeLength="10dip" //定义的衰落(褪去)边缘的长度
    13.android:stackFromBottom="true" //设置为true时,你做好的列表就会显示你列表的最下面
    14.android:transcriptMode="alwaysScroll" //当你动态添加数据时,列表将自动往下滚动最新的条目可以自动滚动到可视范围内
    15.android:drawSelectorOnTop="false" //点击某条记录不放,颜色会在记录的后面成为背景色,内容的文字可见(缺省为false)

    子项
    layout/layout_grid_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    
        <ImageView
            android:id="@+id/iv_head"
            android:layout_width="90dp"
            android:layout_height="90dp"
            android:layout_centerInParent="true"
            android:scaleType="centerCrop"
            />
    
    
    </RelativeLayout>
    

    Activity代码

    
    package com.devilwwj.androiddevelopcourse.activities;
    
    import android.content.Context;
    import android.os.Bundle;
    import android.support.v7.app.ActionBarActivity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.BaseAdapter;
    import android.widget.GridView;
    import android.widget.ImageView;
    
    import com.devilwwj.androiddevelopcourse.R;
    import com.nostra13.universalimageloader.core.ImageLoader;
    
    
    public class GridViewTestActivity extends ActionBarActivity implements OnItemClickListener {
        private GridView gridView;
        private Context mContext;
        private ImageLoader imageLoader;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_gridview);
            mContext = GridViewTestActivity.this;
    
            imageLoader = ImageLoader.getInstance();
    
            gridView = (GridView) this.findViewById(R.id.gridView);
    
    
            gridView.setAdapter(new ImageAdapter(this));
    
        }
    
        // references to our images
        private Integer[] mThumbIds = {
                R.drawable.sample_2, R.drawable.sample_3,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7,
                R.drawable.sample_0, R.drawable.sample_1,
                R.drawable.sample_2, R.drawable.sample_3,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7,
                R.drawable.sample_0, R.drawable.sample_1,
                R.drawable.sample_2, R.drawable.sample_3,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7
        };
    
    
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // TODO: 点击列表跳转到其他页面
    
        }
    
    
        private class ImageAdapter extends BaseAdapter {
    
            private Context mContext;
    
            public ImageAdapter(Context context) {
                this.mContext = context;
            }
    
    
            @Override
            public int getCount() {
                return mThumbIds.length;
            }
    
            @Override
            public Object getItem(int position) {
                return null;
            }
    
            @Override
            public long getItemId(int position) {
                return position;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder viewHolder = null;
    
    
                if (convertView == null) {
                    convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_grid_item, parent, false);
                    viewHolder = new ViewHolder();
                    viewHolder.itemImg = (ImageView) convertView.findViewById(R.id.iv_head);
    
                    convertView.setTag(viewHolder);
    
                } else {
                    viewHolder = (ViewHolder) convertView.getTag();
                }
    
                // 这里只是模拟,实际开发可能需要加载网络图片,可以使用ImageLoader这样的图片加载框架来异步加载图片
                imageLoader.displayImage("drawable://" + mThumbIds[position], viewHolder.itemImg);
    
    
                return convertView;
            }
    
    
            class ViewHolder {
                ImageView itemImg;
            }
        }
    }
    
    

    在Activity中我们做了以下几件事:
    1、初始化控件
    2、定义图片资源mThumbIds
    3、定义ImageAdapter

    上面代码中我们用到了ImageLoader这个图片加载框架,使用它来加载本地drawable资源,实际开发中一般不会这样用,我们传进去的uri是一个图片网络地址,具体的使用方法可以百度学习,这里简单介绍步骤:
    1、 初始化ImageLoader配置
    2、获取ImageLoader实例,调用其displayImage方法异步加载图片

    展开全文
  • GridView控件的简单使用

    千次阅读 2016-11-29 16:08:22
    如果是多行单列,使用listview; 如果是多行多列,使用gridview;activity_main.xml android:layout_width="match_parent" android:layout_height="matc

    如果是多行单列,使用listview;
    如果是多行多列,使用gridview;

    activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="#000"
        >
        <GridView
            android:id="@+id/gview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:numColumns="auto_fit"
            android:columnWidth="150dp"
            android:stretchMode="columnWidth"
            android:listSelector="@drawable/mylist_view"
        ></GridView>
    </LinearLayout>

    GridView的属性介绍:
    android:numColumns=”auto_fit” -列数设置为自动
    android:columnWidth=”90dp”,-每列的宽度,也就是Item的宽度
    android:stretchMode=”columnWidth”-缩放与列宽大小同步
    android:verticalSpacing=”10dp”-垂直边距
    android:horizontalSpacing=”10dp”-水平边距

    好了,Gridview控件如何写入知道了,下面进行数据的构成
    1、准备数据源 —— 准备几张不同的图片

    2、新建适配器 —— SimpleAdapter

    3、加载适配器 —— setAdapter()

    MainActivity.java

    package com.example.testgridview;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.GridView;
    import android.widget.SimpleAdapter;
    
    public class MainActivity extends Activity {
        private GridView gview;
        private List<Map<String, Object>> data_list;
        private SimpleAdapter sim_adapter;
        // 图片封装为一个数组
        private int[] icon = { R.drawable.address_book, R.drawable.calendar,
                R.drawable.camera, R.drawable.clock, R.drawable.games_control,
                R.drawable.messenger, R.drawable.ringtone, R.drawable.settings,
                R.drawable.speech_balloon, R.drawable.weather, R.drawable.world,
                R.drawable.youtube };
        private String[] iconName = { "通讯录", "日历", "照相机", "时钟", "游戏", "短信", "铃声",
                "设置", "语音", "天气", "浏览器", "视频" };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.test);
            gview = (GridView) findViewById(R.id.gview);
            //新建List
            data_list = new ArrayList<Map<String, Object>>();
            //获取数据
            getData();
            //新建适配器
            String [] from ={"image","text"};
            int [] to = {R.id.image,R.id.text};
            sim_adapter = new SimpleAdapter(this, data_list, R.layout.item, from, to);
            //配置适配器
            gview.setAdapter(sim_adapter);
        }
    
    
    
        public List<Map<String, Object>> getData(){        
            //cion和iconName的长度是相同的,这里任选其一都可以
            for(int i=0;i<icon.length;i++){
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("image", icon[i]);
                map.put("text", iconName[i]);
                data_list.add(map);
            }
    
            return data_list;
        }
    }

    item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:gravity="center"
        android:padding="10dp"
        >
        <ImageView 
            android:src="@drawable/ic_launcher"
            android:id="@+id/image"
            android:layout_width="60dp"
            android:layout_height="60dp"
            />
        <TextView 
            android:id="@+id/text"
            android:layout_marginTop="5dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff"
            android:text="文字"
            />
    </LinearLayout>
    展开全文
  • 在开发中可能会遇到某些情况下需要用到日历的功能,并且还要在日历上加标签什么的,最重要的就是android自带...这里就教大家使用GridView来实现,主要是我们比较熟悉这个控件...到时候也可以根据自己的情况进行封装为自...

    在开发中可能会遇到某些情况下需要用到日历的功能,并且还要在日历上加标签什么的,最重要的就是android自带的日历由于各个系统版本不同导致日历的样式也不同,这样就会导致使用起来比较麻烦..而且在日历中加标签也不好实现...所以很多时候日历都是自己去实现的...由于自定义日历会比较麻烦...这里就教大家使用GridView来实现,主要是我们比较熟悉这个控件...到时候也可以根据自己的情况进行封装为自定义View

    下面就先看看效果图.由于是从项目中抽取出来的,某些地方定制性比较强, 可以根据需求自行修改

    效果图

    d8403f5d31ba9562a43309c0bfcff86a.png

    图中的红点就是标签,蓝色背景就是选中的意思.

    下面开始撸代码:

    先上核心的GridView的适配器:

    CalendarAdapter.java

    /**

    * 日历gridview中的每一个item显示的textview

    */

    public class CalendarAdapter extends BaseAdapter {

    private static String TAG = "CalendarAdapter";

    private boolean isLeapyear = false; //是否为闰年

    private int daysOfMonth = 0; //某月的天数

    private int dayOfWeek = 0; //具体某一天是星期几

    private int lastDaysOfMonth = 0; //上一个月的总天数

    private Context context;

    private String[] dayNumber = new String[42]; //一个gridview中的日期存入此数组中

    private SpecialCalendar sc = null;

    private int currentYear = 0;

    private int currentMonth = 0;

    /**

    * 当前选中的日期位置

    */

    private int currentFlag = -1;

    /**

    * 当前选中天的字符串 例:20170830

    */

    private String currentDayStr;

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");

    private Set schDateTagFlag = new ArraySet<>(); //存储当月所有的日程日期(标签)

    private String showYear = ""; //用于在头部显示的年份

    private String showMonth = ""; //用于在头部显示的月份

    private String animalsYear = "";

    private String leapMonth = ""; //闰哪一个月

    private Set mSet = null;

    /**

    * 距离当前月的差(上一个月-1,当前月0,下一个月+1)

    */

    private int jumpMonth = 0;

    public CalendarAdapter(Context context, int year, int month, String currentDayStr) {

    this.context = context;

    sc = new SpecialCalendar();

    currentYear = year;

    currentMonth = month; //得到跳转到的月份

    this.currentDayStr = currentDayStr;

    getCalendar(currentYear, currentMonth);

    }

    @Override

    public int getCount() {

    return dayNumber.length;

    }

    @Override

    public Object getItem(int position) {

    return position;

    }

    @Override

    public long getItemId(int position) {

    return position;

    }

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder myViewHolder = null;

    if (convertView == null || convertView.getTag() == null) {

    convertView = LayoutInflater.from(context).inflate(R.layout.item_select_time, null);

    myViewHolder = new ViewHolder(convertView);

    convertView.setTag(myViewHolder);

    } else {

    myViewHolder = (ViewHolder) convertView.getTag();

    }

    myViewHolder.mIdTvItemSelectTimeDay.setText(dayNumber[position]);

    myViewHolder.mIdTvItemSelectTimeDay.setTextColor(Color.GRAY);//不是当前月为灰

    if (position < daysOfMonth + dayOfWeek && position >= dayOfWeek) {

    // 当前月信息显示

    myViewHolder.mIdTvItemSelectTimeDay.setTextColor(Color.BLACK);// 当月字体设黑

    myViewHolder.mIdTvItemSelectTimeDay.setTag(true);// 当月字体设黑

    }else {

    myViewHolder.mIdTvItemSelectTimeDay.setTag(false);// 当月字体设黑

    }

    if (currentFlag != -1 && currentFlag == position) {

    //设置当天的背景

    myViewHolder.mIdTvItemSelectTimeDay.setBackgroundResource(R.color.mainMenu);

    myViewHolder.mIdTvItemSelectTimeDay.setTextColor(Color.WHITE);

    } else {

    myViewHolder.mIdTvItemSelectTimeDay.setBackgroundColor(0);

    }

    //显示小圆点

    if (schDateTagFlag != null && schDateTagFlag.size() > 0) {

    if (schDateTagFlag.contains(position)) {

    if (myViewHolder.mIdImgItemSelectTimeLogo.getVisibility()!=View.VISIBLE) {

    myViewHolder.mIdImgItemSelectTimeLogo.setVisibility(View.VISIBLE);

    }

    } else {

    if (myViewHolder.mIdImgItemSelectTimeLogo.getVisibility()!=View.GONE) {

    myViewHolder.mIdImgItemSelectTimeLogo.setVisibility(View.GONE);

    }

    }

    } else {

    if (myViewHolder.mIdImgItemSelectTimeLogo.getVisibility()!=View.GONE) {

    myViewHolder.mIdImgItemSelectTimeLogo.setVisibility(View.GONE);

    }

    }

    return convertView;

    }

    /**

    * 下一个月

    */

    public void addMonth() {

    jumpMonth++;

    }

    /**

    * 上一个月

    */

    public void lessMonth() {

    jumpMonth--;

    }

    /**

    * 更新日历数据

    */

    public void upDataMonth() {

    int stepYear;

    int stepMonth = currentMonth + jumpMonth;

    if (stepMonth > 0) {

    //下一个月

    if (stepMonth % 12 == 0) {

    stepYear = currentYear + stepMonth / 12 - 1;

    stepMonth = 12;

    } else {

    stepYear = currentYear + stepMonth / 12;

    stepMonth = stepMonth % 12;

    }

    } else {

    //上一个月

    stepYear = currentYear - 1 + stepMonth / 12;

    stepMonth = stepMonth % 12 + 12;

    }

    getCalendar(stepYear, stepMonth);

    }

    /**

    * 得到某年的某月的天数且这月的第一天是星期几

    *

    * @param year

    * @param month

    */

    private void getCalendar(int year, int month) {

    isLeapyear = sc.isLeapYear(year); //是否为闰年

    daysOfMonth = sc.getDaysOfMonth(isLeapyear, month); //某月的总天数

    dayOfWeek = sc.getWeekdayOfMonth(year, month); //某月第一天为星期几

    lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month - 1); //上一个月的总天数

    getWeek(year, month);

    }

    /**

    * 将一个月中的每一天的值添加入数组dayNuber中

    *

    * @param year

    * @param month

    */

    private void getWeek(int year, int month) {

    schDateTagFlag.clear();

    currentFlag = -1;

    int j = 1;

    //得到当前月的所有日程日期(这些日期需要标记)

    for (int i = 0; i < dayNumber.length; i++) {

    if (i < dayOfWeek) { //前一个月

    int temp = lastDaysOfMonth - dayOfWeek + 1;

    dayNumber[i] = (temp + i) + "";

    } else if (i < daysOfMonth + dayOfWeek) {//本月

    int day = i - dayOfWeek + 1; //得到的日期

    dayNumber[i] = i - dayOfWeek + 1 + "";

    //对于当前月才去标记当前日期

    String yearStr = String.valueOf(year);

    String monthStr =getStr(String.valueOf(month),2);

    String dayStr =getStr(String.valueOf(day),2);

    String timeAll = yearStr + monthStr + dayStr;

    if (timeAll.equals(currentDayStr)) {//判断选中的位置

    currentFlag = i;

    }

    if (mSet != null && mSet.size() > 0) {

    for (String s : mSet) {//迭代器遍历判断是否需要带标签

    if (timeAll.equals(s)) {

    schDateTagFlag.add(i);

    }

    }

    }

    setShowYear(yearStr);

    setShowMonth(String.valueOf(month));

    } else { //下一个月

    dayNumber[i] = j + "";

    j++;

    }

    }

    }

    /**

    * 获取当前时间 样式:20170830

    * @param position

    * @return

    */

    public String getItemTime(int position) {

    String month = getStr(getShowMonth(), 2);

    String day = getStr(getDateByClickItem(position), 2);

    return getShowYear() + month + day;

    }

    /**

    * 保留N位整数,不足前面补0

    *

    * @param file String

    * @param bit 位数

    * @return

    */

    public static String getStr(String file,int bit) {

    while (file.length() < bit)

    file = "0" + file;

    return file;

    }

    /**

    * 点击每一个item时返回item中的日期

    *

    * @param position

    * @return

    */

    public String getDateByClickItem(int position) {

    return dayNumber[position];

    }

    /**

    * 在点击gridView时,得到这个月中第一天的位置

    *

    * @return

    */

    public int getStartPositon() {

    return dayOfWeek + 7;

    }

    /**

    * 在点击gridView时,得到这个月中最后一天的位置

    *

    * @return

    */

    public int getEndPosition() {

    return (dayOfWeek + daysOfMonth + 7) - 1;

    }

    public String getShowYear() {

    return showYear;

    }

    public void setShowYear(String showYear) {

    this.showYear = showYear;

    }

    public String getShowMonth() {

    return showMonth;

    }

    public void setShowMonth(String showMonth) {

    this.showMonth = showMonth;

    }

    public String getAnimalsYear() {

    return animalsYear;

    }

    public void setAnimalsYear(String animalsYear) {

    this.animalsYear = animalsYear;

    }

    public String getLeapMonth() {

    return leapMonth;

    }

    public void setLeapMonth(String leapMonth) {

    this.leapMonth = leapMonth;

    }

    public Set getSet() {

    return mSet;

    }

    public void setSet(Set set) {

    mSet = set;

    }

    static class ViewHolder {

    @BindView(R.id.id_img_item_select_time_logo)

    ImageView mIdImgItemSelectTimeLogo;

    @BindView(R.id.id_tv_item_select_time_day)

    TextView mIdTvItemSelectTimeDay;

    ViewHolder(View view) {

    ButterKnife.bind(this, view);

    }

    }

    }

    日历工具类:

    /**

    * 日历工具类

    */

    public class SpecialCalendar {

    private int daysOfMonth = 0; //某月的天数

    private int dayOfWeek = 0; //具体某一天是星期几

    /**

    * 判断是否为闰年

    * @param year

    * @return

    */

    public boolean isLeapYear(int year) {

    if (year % 100 == 0 && year % 400 == 0) {

    return true;

    } else if (year % 100 != 0 && year % 4 == 0) {

    return true;

    }

    return false;

    }

    /**

    * 得到某月有多少天数

    * @param isLeapyear

    * @param month

    * @return

    */

    public int getDaysOfMonth(boolean isLeapyear, int month) {

    switch (month) {

    case 1:

    case 3:

    case 5:

    case 7:

    case 8:

    case 10:

    case 12:

    daysOfMonth = 31;

    break;

    case 4:

    case 6:

    case 9:

    case 11:

    daysOfMonth = 30;

    break;

    case 2:

    if (isLeapyear) {

    daysOfMonth = 29;

    } else {

    daysOfMonth = 28;

    }

    }

    return daysOfMonth;

    }

    /**

    * 指定某年中的某月的第一天是星期几

    * @param year

    * @param month

    * @return

    */

    public int getWeekdayOfMonth(int year, int month){

    Calendar cal = Calendar.getInstance();

    cal.set(year, month-1, 1);

    dayOfWeek = cal.get(Calendar.DAY_OF_WEEK)-1;

    return dayOfWeek;

    }

    }

    布局文件:

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical">

    layout="@layout/layout_public_finish_menu"

    />

    android:layout_width="match_parent"

    android:layout_height="40dp"

    android:background="@color/bg_home_gone_menu"

    android:gravity="center"

    android:orientation="horizontal"

    >

    android:id="@+id/id_img_select_time_less"

    android:layout_width="wrap_content"

    android:layout_height="match_parent"

    android:layout_weight="1"

    android:padding="5dp"

    android:src="@mipmap/ic_sd_time_less"

    android:background="@drawable/selector_public_btn_bg"

    />

    android:id="@+id/id_tv_select_time_show"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_weight="4"

    android:gravity="center"

    android:text="年月"

    android:textColor="@color/white"

    android:textSize="@dimen/default_big"

    />

    android:id="@+id/id_img_select_time_add"

    android:layout_width="wrap_content"

    android:layout_height="match_parent"

    android:layout_weight="1"

    android:padding="5dp"

    android:src="@mipmap/ic_sd_time_add"

    android:background="@drawable/selector_public_btn_bg"

    />

    android:id="@+id/id_gv_select_item"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:background="@drawable/bg_rectangle_null_black_1"

    android:clickable="true"

    android:gravity="center"

    android:layout_gravity="center"

    android:clipChildren="true"

    android:listSelector="@null"

    android:numColumns="7"

    android:padding="1dp"

    android:layout_margin="5dp"

    android:stretchMode="columnWidth"

    />

    Item布局

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:background="@drawable/bg_rectangle_null_black_1">

    android:id="@+id/id_tv_item_select_time_day"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:gravity="center"

    android:text="天"

    android:textSize="@dimen/default_big"

    android:layout_margin="1dp"

    android:textStyle="bold"

    />

    android:id="@+id/id_img_item_select_time_logo"

    android:layout_width="5dp"

    android:layout_height="5dp"

    android:layout_margin="3dp"

    android:src="@drawable/shap_doorbell_oval_red"

    android:visibility="gone"

    />

    布局只供参考...可以根据需求进行修改

    下面就看看简单的调用

    //传入当前的年,月..已经选中的时间(20170830)

    mAdapter = new CalendarAdapter(mContext, year_c, month_c, currentDayStr);

    mIdGvSelectItem.setAdapter(mAdapter);

    /**

    * GridView Item的点击事件

    */

    private class MyGvListener implements AdapterView.OnItemClickListener {

    @Override

    public void onItemClick(AdapterView> parent, View view, int position, long id) {

    TextView mTv = (TextView) view.findViewById(R.id.id_tv_item_select_time_day);

    boolean isOnClick = (boolean) mTv.getTag();

    if (isOnClick) {

    String time = mAdapter.getItemTime(position);

    Intent mIntent = getIntent();

    mIntent.putExtra("fileDate", time);

    setResult(AppStart.SDVA_SDTA, mIntent);

    finish();

    Log.i(TAG,"当前选择的时间:" + time);

    }

    }

    }

    /**

    * 点击事件逻辑处理

    */

    private class MyListener implements View.OnClickListener {

    @Override

    public void onClick(View v) {

    switch (v.getId()) {

    //上一个月

    case R.id.id_img_select_time_less:

    mAdapter.lessMonth();

    mHandler.sendEmptyMessage(UPDATA_TIME);

    addTextToTopTextView(mIdTvSelectTimeShow);

    break;

    //下一个月

    case R.id.id_img_select_time_add:

    mAdapter.addMonth();

    mHandler.sendEmptyMessage(UPDATA_TIME);

    addTextToTopTextView(mIdTvSelectTimeShow);

    break;

    }

    }

    }

    private Set dayEventCount = new HashSet<>();

    //设置需要显示标签的实际

    mAdapter.setSet(dayEventCount);

    //更新

    @Override

    protected void uiHandlerMessage(Message msg) {

    switch (msg.what) {

    case UPDATA_TIME:

    mAdapter.upDataMonth();

    mAdapter.notifyDataSetChanged();

    break;

    }

    }

    调用部分的代码由于是从项目中直接复制出来的..代码的前后没有什么关联性,主要是说明功能的..请根据自己的项目进行调整..

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • GridView 由一组字段组成,这些 字段指出了应将来自 DataSource 的哪些属性呈现在输出中,以及数据以哪种方式呈现。 BoundField 是最简单的字段类型,它以文本的形式显示数据值。其他字段类型使用交互 HTML 元素显示...

    简介

    GridView 由一组字段组成,这些 字段指出了应将来自 DataSource 的哪些属性呈现在输出中,以及数据以哪种方式呈现。 BoundField 是最简单的字段类型,它以文本的形式显示数据值。其他字段类型使用交互 HTML 元素显示数据。例如,CheckBoxField 呈现为一个复选框,其选中状态取决于某个特定数据字段的值。 ImageField 呈现一个图形,其图形来源也取决于某个特定的数据字段。超级链接和按钮的状态取决于某个基础数据字段的值,可以使用 HyperLinkField 和 ButtonField 字段类型呈现。

    尽管 CheckBoxField 、ImageField 、HyperLinkField 和ButtonField 字段类型允许使用数据的交互视图,但它们仍有一些格式设置的限制。一个 CheckBoxField 只能显示一个复选框,而一个 ImageField 只能显示一个图形。但如果一个特定字段需要显示一些文本、一个复选框 以及 一个图形,而这些内容分别基于不同的数据字段值,我们该怎么办?或者,如果我们需要使用除 CheckBox 、 Image 、 HyperLink 或 Button 之外的其它 Web 控件来显示数据,我们该怎么办?此外, BoundField 只能显示一个数据字段。那么如何在 GridView 的一列中显示两个或更多的数据字段值?

    为了适应这些灵活性的需求,GridView 提供了使用模板 呈现的TemplateField 。模板可能包含静态 HTML 、Web 控件与数据绑定语法的组合。此外, TemplateField 提供了多种模板,可用于针对不同的情况自定义呈现方式。例如,ItemTemplate 默认用于呈现每一行的单元格,而 EditItemTemplate 模板可用于自定义数据编辑界面。

    在本教程中,我们将研究如何使用 TemplateField 与 GridView 控件实现更大程度的定制。在上一篇教程中,我们学习了如何使用 DataBound 和 RowDataBound Event Handler 基于基础数据,自定义格式。另一种方式是在模板中调用格式设置方法。我们将在本教程中讨论这种方式。

    在本教程中,我们会 使用 TemplateField 自定义一个员工列表的外观。具体地说,我们将列出所有员工,将他们的姓名放在一列中,入职日期放在一个 Calendar 控件中,另外再显示一个状态列指示他们进入公司的天数。

    图1 :使用 3 个 TemplateField 自定义数据显示方式

    步骤1 :将数据绑定到 GridView

    在需要使用TemplateField 自定义外观的报表场景中,我发现最简单的方法是先创建一个只包含BoundField 的 GridView 控件,然后向它添加一些 TemplateField ,或根据需要将现有的 BoundField 转换为 TemplateField 。因此,本教程将首先通过设计器向页面添加一个 GridView ,并将其绑定到一个返回员工列表的 ObjectDataSource 。这将创建一个 GridView ,其中包含的 BoundField 对应员工信息的各个字段。

    打开GridViewTemplateField.aspx 页面,从 Toolbox 中将 一个 GridView 拖放 到设计器上。从 GridView 的智能标记上,选择添加一个新的 ObjectDataSource 控件,使其调用 EmployeesBLL 类的 GetEmployees() 方法。

    图2 :添加一个新的 ObjectDataSource 控件来调用 GetEmployees() 方法

    以这种方式绑定 GridView 将自动为以下每个员工属性添加一个 BoundField :EmployeeID 、LastName 、FirstName 、Title 、HireDate 、ReportsTo 和Country 。在此报表中,我们不希望显示 EmployeeID 、 ReportsTo 和 Country 属性。要删除这些 BoundField ,我们可以:

    • 使用 Fields 对话框:单击 GridView 的智能标记上的 Edit Columns 链接来打开此对话框。然后,在左下角的列表中选择需要删除的 BoundField 并单击红色的 X 按钮,这个 BoundField 就被删除了。
    • 手动编辑 GridView 的声明式语法。操作方式为:在 Source 视图中找到希望删除的 BoundField 对应的 <asp:BoundField> 元素,删除这些元素即可。

    删除 EmployeeID 、ReportsTo 和 Country 的 BoundField 后,GridView 的标记应如下所示:

    <asp:GridView ID="GridView1" runat="server" 
        AutoGenerateColumns="False" DataKeyNames="EmployeeID" 
        DataSourceID="ObjectDataSource1"> 
        <Columns> 
            <asp:BoundField DataField="LastName" HeaderText="LastName" 
                SortExpression="LastName" /> 
            <asp:BoundField DataField="FirstName" HeaderText="FirstName" 
                SortExpression="FirstName" /> 
            <asp:BoundField DataField="Title" HeaderText="Title" 
                SortExpression="Title" /> 
            <asp:BoundField DataField="HireDate" HeaderText="HireDate" 
                SortExpression="HireDate" /> 
        </Columns> 
    </asp:GridView>

    花些时间在浏览器中查看目前的成果。现在,我们能看到一张表格,表格中每条记录对应一位员工的信息,这些信息分为 4 列,分别是:员工的姓、名、职位以及入职日期。

    图3 :显示了每位员工的 LastName 、FirstName 、Title 和 HireDate 字段

    步骤2 : 在一列中显示姓名

    现在,每位员工的姓和名分开在两列中显示。但将这两列合并为一列的效果会更好。要做到这一点,我们需要使用一个 TemplateField 。操作方法有两种: 1. 添加一个新的 TemplateField ,为其添加所需的标记和数据绑定语法,然后再删除 FirstName 和 LastName 两个 BoundField ; 2. 将 FirstName BoundField 转换为一个 TemplateField ,编辑该 TemplateField ,使其包含 LastName 值,然后再删除 LastName BoundField 。

    这两种方法得到的结果是相同的,但我个人倾向于使用将 BoundField 转换为 TemplateField 的方法。因为这种转换会自动添加带有 Web 控件和数据绑定语法的 ItemTemplate 和 EditItemTemplate ,它们可以 实现与 BoundField 相似的外观和功能。这样做的好处在于,因为转换过程帮我们完成了一些工作,我们需要对 TemplateField 执行的操作就减少了。

    要将现有的BoundField 转换为 TemplateField ,单击 GridView 智能标记上的 Edit Columns 链接打开 Fields 对话框。从左下角的列表中选择要转换的 BoundField ,然后单击右下角的 "Convert this field into a TemplateField" 链接。

    图4 :在 Fields 对话框中,将一个 BoundField 转换为 TemplateField

    继续操作,将 FirstName BoundField 转换为 TemplateField 。完成此更改后,我们在 设计器 中看不出有哪些不同。这是因为,将 BoundField 转换为 TemplateField 将创建一个外观与之前 BoundField 相似的 TemplateField 。但尽管目前在设计器中看不出任何区别,转换过程已将 BoundField 的声明式语法 - <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" /> - 替换为以下 TemplateField 语法:

    <asp:TemplateField HeaderText="FirstName" SortExpression="FirstName"> 
        <EditItemTemplate> 
            <asp:TextBox ID="TextBox1" runat="server" 
                Text='<%# Bind("FirstName") %>'></asp:TextBox> 
        </EditItemTemplate> 
        <ItemTemplate> 
            <asp:Label ID="Label1" runat="server" 
                Text='<%# Bind("FirstName") %>'></asp:Label> 
        </ItemTemplate> 
    </asp:TemplateField>

    正如我们看到的那样,TemplateField 包含两个模板:一个ItemTemplate( 带有一个 Text 属性设为 FirstName 数据字段值的Label )和一个 EditItemTemplate ( 带有一个 Text 属性也设为 FirstName 数据字段值的TextBox 控件 )。数据绑定语法 - <%# Bind("fieldName") %> - 表示数据字段 fieldName 被绑定到指定的 Web 控件属性。

    要将 LastName 数据字段值添加到此 TemplateField ,我们需要在ItemTemplate 中添加另一个 Web Label 控件,并将其 Text 属性绑定到 LastName 。通过手动设置或设计器都可以完成此操作。手动设置的方式是向 ItemTemplate 添加以下声明式语法:

    <asp:TemplateField HeaderText="FirstName" SortExpression="FirstName"> 
        <EditItemTemplate> 
            <asp:TextBox ID="TextBox1" runat="server" 
                Text='<%# Bind("FirstName") %>'></asp:TextBox> 
        </EditItemTemplate> 
        <ItemTemplate> 
            <asp:Label ID="Label1" runat="server" 
                Text='<%# Bind("FirstName") %>'></asp:Label> 
            <asp:Label ID="Label2" runat="server" 
                Text='<%# Bind("LastName") %>'></asp:Label> 
        </ItemTemplate> 
    </asp:TemplateField>

    通过设计器添加的方法是单击 GridView 的智能标记上的 Edit Templates 链接,显示GridView 的模板编辑界面。此界面的智能标记中列出了 GridView 中的模板。由于我们现在只有一个 TemplateField ,因此下拉列表中列出的模板只有 FirstName TemplateField 的模板,以及 EmptyDataTemplate 和 PagerTemplate 。如果指定了 EmptyDataTemplate 模板,该模板将在绑定到 GridView 的数据中没有结果时呈现 GridView 的输出。如果指定了 PagerTemplate ,该模板将用于呈现支持分页的 GridView 的分页界面。

    图5 :可以通过 设计器 编辑GridView 的模板

    如果还要在FirstName TemplateField 中显示 LastName ,则 从Toolbox 中 将 Label 控件 拖放到 GridView 模板编辑界面上的 FirstName TemplateField 的 ItemTemplate 中 。

    图6 :向 FirstName TemplateField 的 ItemTemplate 添加一个 Web Label 控件

    现在,添加到TemplateField 的 Web Label 控件的Text 属性为 "Label" 。我们需要更改该属性,将其绑定到LastName 数据字段的值。操作方式为:单击 Label 控件的智能标记,然后选择 Edit DataBindings 选项。

    图7 :从 Label 的智能标记上选择 Edit DataBindings 选项

    DataBindings 对话框弹出。从此对话框中,你可从左面的列表中选择要加入数据绑定的属性,并从右面的下拉列表中选择要将属性绑定到的字段。我们从左面列表中选择Text 属性 ,从 右面列表中选择 L astName 字段,然后点击 OK 。

    图8 :将 Text 属性绑定到 LastName 数据字段

    注意:通过 DataBindings 对话框,我们可指定是否进行双向数据绑定。如果不选择双向绑定,则将使用数据绑定语法 <%# Eval("LastName")%> 代替<%# Bind("LastName")%> 。本教程中,两种方法都可以使用。双向数据绑定在插入和编辑数据时非常重要。但如果只需要显示数据,两种方法都可胜任。我们将在今后的教程中详细讨论双向数据绑定。

    花些时间在浏览器中查看本页。正如您所看到的那样,GridView 中仍包含 4 列。但不同的是,FirstName 列现在同时 列出了 FirstName 和 LastName 数据字段值。

    图9 :FirstName 和 LastName 值同时显示在一列中

    这一步的最后一个操作是删除 LastName BoundField ,并将FirstName TemplateField 的HeaderText 属性更名为 "Name" 。经上述更改后,GridView 的声明性标记应如下所示:

    <asp:GridView ID="GridView1" runat="server" 
        AutoGenerateColumns="False" DataKeyNames="EmployeeID" 
        DataSourceID="ObjectDataSource1"> 
        <Columns> 
            <asp:TemplateField HeaderText="Name" SortExpression="FirstName"> 
                <EditItemTemplate> 
                    <asp:TextBox ID="TextBox1" runat="server" 
                        Text='<%# Bind("FirstName") %>'></asp:TextBox> 
                </EditItemTemplate> 
                <ItemTemplate> 
                    <asp:Label ID="Label1" runat="server" 
                        Text='<%# Bind("FirstName") %>'></asp:Label> 
                    <asp:Label ID="Label2" runat="server" 
                        Text='<%# Eval("LastName") %>'></asp:Label> 
                </ItemTemplate> 
            </asp:TemplateField> 
            <asp:BoundField DataField="Title" HeaderText="Title" 
                SortExpression="Title" /> 
            <asp:BoundField DataField="HireDate" HeaderText="HireDate" 
                SortExpression="HireDate" /> 
        </Columns> 
    </asp:GridView>

    图10 :所有员工的姓和名都显示在同一列中

    步骤3 :使用 Calendar 控件显示 HiredDate 字段

    在GridView 中将数据字段值显示为文本与使用 BoundField 一样简单。但在某些特定场景下,最好使用特定的 Web 控件而不是文本来呈现数据。使用 TemplateField 就 可以进行数据显示的自定义。例如,员工的入职日期可以在日历( 使用 Calendar 控件 )中突出显示,而不是用文本显示。

    操作方法为,首先将HiredDate BoundField 转换为 TemplateField 。只需进入 GridView 的智能标记,并单击 Edit Columns 链接来打开 Fields 对话框, 选择HiredDate BoundField 并单击 "Convert this field into a TemplateField" 。

    图11 :将 HiredDate BoundField 转换为 TemplateField

    正如我们在步骤 2 中看到的那样,此操作将 BoundField 替换为一个包含 ItemTemplate 和 EditItemTemplate 的 TemplateField 。其中的 ItemTemplate 和 EditItemTemplate 分别带有一个Label 和一个 TextBox ,它们的 Text 属性都通过数据绑定语法<%# Bind("HiredDate")%> 绑定到HiredDate 值。

    要用Calendar 控件替换文本,应对模板进行编辑,删除Label ,添加一个 Calendar 控件。在设计器中选择 GridView 的智能标记上的 Edit Templates,并从下拉列表中选择 HireDate TemplateField 的 ItemTemplate 。然后,删除 Label 控件,并从 Toolbox 中将一个 Calendar 控件拖放到模板编辑界面。

    图12 :向 HireDate TemplateField 的 ItemTemplate 添加一个 Calendar 控件

    现在,GridView 每行的 HiredDate TemplateField 中都包含一个 Calendar 控件。但员工的实际 HiredDate 值并未在 Calendar 控件中设置,这使每个Calendar 控件都默认显示当前月份和日期。为解决此问题,需要将每个员工的 HiredDate 赋值给 Calendar 控件的 SelectedDate 和VisibleDate 属性。

    在Calendar 控件的智能标记中选择 Edit DataBindings 。然后,将SelectedDate 和 VisibleDate 属性绑定到HiredDate 数据字段。

    图13 :将 SelectedDate 和 VisibleDate 属性绑定到 HiredDate 数据字段

    注意:Calendar 控件的选中日期不一定是可见的。例如,Calendar 的选中日期可能为 1999 年 8 月 1 日,但显示的可能是当前日期。选中的日期和显示的日期分别由 Calendar 控件的 SelectedDate 和 VisibleDate 属性指定。由于我们既想选中员工的 HiredDate ,又想确保将其显示出来,那么我们就需要将这两个属性都绑定到 HireDate 数据字段。

    现在,我们再到浏览器中查看该页面。这次,日历中显示的是员工入职的月份,并突出显示了员工的入职日期。

    图14 :Calendar 控件显示了员工的 HiredDate

    注意:与前面看到的示例不同,本教程中没有 将 GridView 的 EnableViewState 属性设为 false 。这是因为,单击 Calendar 控件的日期会产生一次回传,将 Calendar 的选中日期设为刚才单击的日期。但如果禁用了 GridView 的视图状态,每一次回传都将导致 GridView 的数据重新绑定到基础数据源,从而导致 Calendar 的选中日期被重新设回 员工的 HireDate ,覆盖用户选中的日期。

    本教程提出此观点仅供大家了解,因为用户不应该能够更新员工的 HireDate 。最好的办法可能是对 Calendar 控件进行配置,将其日期设为不可选。但无论如何,我们应该注意到,在某些情况下必须启用视图状态才能提供特定功能。

    步骤4 :显示员工在公司的工作天数

    现在我们已经学习了 TemplateField 的两种应用:

    • 将两个或多个数据字段值合并到一列中 ;
    • 使用 Web 控件代替文本显示数据字段值。

    TemplateField 的第三种用途是显示关于 GridView 基础数据的元数据。例如,除了显示员工的入职时间,我们可能还想用一列显示员工在公司工作的总天数。

    当基础数据在网页报表中的显示方式需要与它们在数据库中的存储格式不同时,TemplateField 也可以发挥作用。假设 Employees 表格有一个 Gender 字段,用于存储字符 M 或 F 来标识员工的性别。而在网页上显示时,我们可能希望将性别信息显示为 "Male" 或 "Female" ,而不是 "M" 或 "F" 。

    要处理这些 场景,我们可以在ASP.NET 页面的code-behind 类中( 或在一个实现为静态方法的独立的类库中 )创建一个从模板调用的格式设置方法。这种格式设置方法从模板中调用,使用的数据绑定语法与前面用过的语法相同。格式设置方法可以携带任意数量的参数,但必须返回一个字符串。该字符串即为用于插入到模板中的 HTML 。

    为演示此概念,让我们在报表中增加一列来显示员工在公司工作的总天数。此格式设置方法将携带一个 Northwind.EmployeesRow 对象,并以字符串的形式返回员工在公司工作的总天数。此方法可以添加到 ASP.NET 页面的code-behind类中,但必须 标记为受保护或公共方法,以便从模板访问。

    protected string DisplayDaysOnJob(Northwind.EmployeesRow employee) 

        // Make sure HiredDate is not null... if so, return "Unknown" 
        if (employee.IsHireDateNull()) 
            return "Unknown"; 
        else 
        { 
            // Returns the number of days between the current 
            // date/time and HireDate 
            TimeSpan ts = DateTime.Now.Subtract(employee.HireDate); 
            return ts.Days.ToString("#,##0"); 
        } 
    }

    由于HiredDate 字段可以包含 NULL 数据库值,我们在继续运算之前必须首先确保此值不为NULL 。如果 HiredDate 值为NULL ,我们只会返回字符串 "Unknown" 。如果不为 NULL ,则计算当前日期与 HiredDate 值的差,然后返回天数。

    要应用这个方法,我们需要使用数据绑定语法从 GridView 的 TemplateField 中调用此方法。首先,向GridView 添加一个新的 TemplateField :单击 GridView 的智能标记上的 Edit Columns 链接,然后添加一个新的 TemplateField 即可。

    图15 :向 GridView 添加一个新的 TemplateField

    将这个新的TemplateField 的 HeaderText 属性设为"Days on the Job" ,并将它的 ItemStyle 的HorizontalAlign 属性设为 Center 。要从模板调用 DisplayDaysOnJob 方法,添加一个 ItemTemplate 并使用以下数据绑定语法:

    <%# DisplayDaysOnJob((Northwind.EmployeesRow) ((System.Data.DataRowView) Container.DataItem).Row) %>

    Container.DataItem 返回一个 DataRowView 对象,该对象与绑定到 GridViewRow 的 DataSource 记录相对应。它的 Row 属性返回强类型的 Northwind.EmployeesRow ,后者将被传递给 DisplayDaysOnJob 方法。此数据绑定语法可以直接显示在 ItemTemplate 中(如下面的声明式语法所示),也可指定给 Web Label 控件的 Text 属性。

    注意:除了传递一个 EmployeesRow 实例,我们也可以使用 <%# DisplayDaysOnJob(Eval("HireDate")) %> 来传递 HireDate 值。但由于 Eval 方法返回一个对象,因此我们必须修改 DisplayDaysOnJob 方法的签名,使其接受一个对象类型的输入参数。不能随意地将 Eval("HireDate") 调用的结果赋值给 DateTime ,因为 Employees 表的 HireDate 列可能包含 NULL 值。因此,我们需要接受一个对象作为 DisplayDaysOnJob 方法的输入参数,检查它是否有 NULL 数据库值(可使用 Convert.IsDBNull(objectToCheck) 进行检查),然后根据情况继续后面的步骤。

    鉴于上述细微差别,我还是选择传递整个 EmployeesRow 实例。在下一篇教程中,我将介绍一个更合适使用Eval("columnName") 语法将输入参数传递给格式设置方法的示例。

    在添加了 TemplateField 且从 ItemTemplate 调用了 DisplayDaysOnJob 方法之后,用于 GridView 的声明式语法如下所示 :

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID" 
                DataSourceID="ObjectDataSource1"> 
                <Columns> 
                    <asp:TemplateField HeaderText="Name" SortExpression="FirstName"> 
                        <EditItemTemplate> 
                            <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("FirstName") %>'></asp:TextBox> 
                        </EditItemTemplate> 
                        <ItemTemplate> 
                            <asp:Label ID="Label1" runat="server" Text='<%# Bind("FirstName") %>'></asp:Label> 
                            <asp:Label ID="Label2" runat="server" Text='<%# Eval("LastName") %>'></asp:Label> 
                        </ItemTemplate> 
                    </asp:TemplateField> 
                    <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" /> 
                    <asp:TemplateField HeaderText="HireDate" SortExpression=" HireDate"> 
                        <EditItemTemplate> 
                            <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("HireDate") %>'></asp:TextBox> 
                        </EditItemTemplate> 
                        <ItemTemplate> 
                            <asp:Calendar ID="Calendar1" runat="server" SelectedDate='<%# Bind("HireDate") %>' 
                                VisibleDate='<%# Eval("HireDate") %>'></asp:Calendar> 
                        </ItemTemplate> 
                    </asp:TemplateField> 
                    <asp:TemplateField HeaderText="Days On The Job"> 
                        <ItemTemplate> 
                            <%# DisplayDaysOnJob(CType(CType(Container.DataItem, DataRowView).Row, Northwind.EmployeesRow)) %> 
                        </ItemTemplate> 
                        <ItemStyle HorizontalAlign="Center" /> 
                    </asp:TemplateField> 
                </Columns> 
            </asp:GridView>

    在完成本教程的内容后,通过浏览器查看页面的效果如图 16 所示。

    图16 :显示了员工在公司工作的总天数

    小结

    相对于其它字段控件,GridView 控件中的 TemplateField 可以更灵活地显示数据。TemplateField 尤其适用于以下场景 :

    • 需要在一个 GridView 列中显示多个数据字段
    • 使用 Web 控件展示数据比用纯文本的效果更好
    • 输出取决于基础数据 , 如显示元数据或重新设置数据的格式

    除了自定义数据的显示方式,TemplateField 还可用于自定义用户编辑和插入数据的用户界面,后面的教程会对此作详细介绍。

    接下来的两篇教程将继续介绍模板。我们会先讨论在 DetailsView 中使用 TemplateField 的情况。然后再看看 FormView ,该视图使用模板代替字段来提供更灵活的数据布局和结构。

    快乐编程 !

    转载于:https://www.cnblogs.com/uddgm/articles/5451203.html

    展开全文
  • 最近工作的需求上面需要一个日历控件,之前也在网上找了不少开源的日历控件,但是效果总是不尽人意,也许也是自己水平有限,有些代码确实太过繁琐还看不周全,没办法,只好自己动手来写了。 先简单上一张效果图 ...
  • 最近用到的一个日历控件,记录下,效果如图 代码下载地址:点击打开链接 布局文件 android:layout_width=match_parent android:layout_height=wrap_content android:orientation=vertical android:visibility...
  • 本来想直接用网上的demo,但是看了看需求以及实现方式,觉得改动有点大,所以就决定还是自己去写个日历控件,同时也算是复习下calendar类相关信息吧,由于需求不同,需要加点滑动的东西,想了下还是直接利用系统提供...
  • package com.example.gridview; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; imp
  • Android精美日历控件CalendarView自定义使用完全解析

    万次阅读 多人点赞 2018-01-23 22:05:07
    此框架采用组合的方式,各个模块互相独立,可自由采用各种提供的控件组合,完全自定义自己需要的UI,周视图和月视图可通过简单自定义任意自由绘制,不怕美工提需求!!!下面教程将介绍如何实现3个API,自定义Canvas...
  • 本来想直接用网上的demo,但是看了看需求以及实现方式,觉得改动有点大,所以就决定还是自己去写个日历控件,同时也算是复习下calendar类相关信息吧,由于需求不同,需要加点滑动的东西,想了下还是直接利用系统提供...
  • 高仿钉钉和小米的日历控件

    千次阅读 2017-08-28 17:25:02
    高仿钉钉和小米的日历控件
  • Android-CalendarView-masterAndroid开发实现自定义日历、日期选择控件 最近项目需要日历效果,考虑用第三方的反而不太适合设计需求,修改复杂,与其这样不入自己重新写一个干净的控件。虽不是什么牛逼控件,但是也...
  • 通过listview+gridview+自定义view 定义滑动显示每一年的所有日期。。。。。。。。。。。。。。。。。
  • .NET 使用datagridview 在单元格中加入日历选择控件的方法 在最近的项目改动中,需要在单元格的日期列中用日历选择的方式提供选择,翻阅了许多的资料 终于还是解决了问题 现在记录一下学习过程和解决过程 网络上有很...
  • 如果是列表(单列多行形式)的使用ListView,如果是多行多列网状形式的优先使用GridView。android:layout_width="match_parent"android:layout_height="match_parent" >GirdView的一些属性:android:numColumns=...
  • Qml控件之Calendar日历

    2021-01-08 23:43:33
    Calendar(日历)控件是基于Qml实现的,它兼容于QtQuick 1.x和QtQuick 2.x。可用于显示日期信息。
  • GridView控件中显示相应的数据。 设置的分页。 在点击页码时,每次都会回到最大的层级下的数据。   希望可以在每个层级都可以正常的分页,不要跳到最大的层级下。 请大侠给点思路。。 有代码参考,就...
  • 日历控件clander

    2016-01-13 23:04:44
    Android写了一个日历控件,请大家多多指教 ...这个日历控件是改一个可以滑动的scrollview嵌套一个GridView按月份展示。期间查了很多资料,呕心沥血之作。。。由于刚刚开始研究Android,希望多多给意见。
  • ViewPager中加载GridView实现日历

    热门讨论 2014-02-28 14:18:47
    android ViewPager控件中利用GridView来实现日历功能,实现了日期选择功能,示例滑动时带有底部indicator效果
  • 想要知道关于更多自定义View的实例,请参考:android自定义View...看完这个是不是有点想法了,好像没那么难了,主要使用到了几个基本控件和一个GridView。啊!你不知道GridView?那没办法了,自己百度去吧。下面开始...
  • android日历控件

    2021-06-09 10:35:34
    1,本人应产品需求, 要一个可上下滑动的一个日历, 仿Clue实现, 本人基于Square写的一个Calendar Demo实现此功能, 得,现在又需要可以无限滑动, 要求看到所有的数据, 但是生成数据的方式需要变, 本人在3考虑, 对产品和...
  • asp.net中自带了一个非常不错的日历控件,但在其呈现方式上还是稍有欠缺。现在我们用一个小技巧,可以轻松创建一个弹出式日期。自此你再也不用去网上找那个带了很多脚本代码的JS制作的弹出式日期控件了。 实现,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,334
精华内容 1,333
关键字:

日历gridview控件的使用