精华内容
下载资源
问答
  • 在编程入门1中,我们通过WINFORM控件画出了登录界面,我们今天写登录界面的登录按钮事件。装修预算小程序登录按钮事件在上图中,我们看到了,有几个判断 ,在C#中,if ,else是作为条件判断语句来使用。条件判断...

    在编程入门1中,我们通过WINFORM等控件画出了登录界面,我们今天写登录界面的登录按钮事件。

    aec40982ba18ebb28fc0a4aaa8033014.png

    装修预算小程序登录按钮事件

    在上图中,我们看到了,有几个判断 ,在C#中,if ,else是作为条件判断语句来使用。条件判断语句可成对出现,也可以不成对出现,在我们日常编程中,尽量把条件判断写清楚,特别是在后期修改代码的时候,可一目了然。

    84f686f19a3c0b832543e28dc99e2a08.png

    if , else判断语句

     if (Common.IsNotEmpty(new string[] { this.txtLogin.Text.Trim(), this.txtPass.Text.Trim() }))

    在这个地方有一行的这样的代码 ,我们点击Common.IsNotEmpty右键 ,转到定义,即可看到,这个方法体的内容 。如下所示:

      ///         /// 判断传入的字符串数组中是否有空字符串        ///         public static bool IsNotEmpty(string[] straar)        {            bool bl = false;            if (straar != null && straar.Length > 0)            {                foreach (string str in straar)                {                    if (str != null && str.Trim() != "")                        bl = true;                    else                    {                        bl = false;                        break;                    }                }            }            else                bl = false;            return bl;        }

    这个方法主要是为了校验数组中的元素是否为空,也就是判断登录信息是否输入完整 。如果输入不完整的话,我们则抛出异常信息(用户登录信息不完整)

     syUser su = new syUser();                    su.LoginID = this.txtLogin.Text.Trim();                    su.LoginPass = this.txtPass.Text.Trim();                    su = su.Load(new string[] { "LoginID", "LoginPass" });                    if (su != null && su.ID > 0)                    {                        Common.SessionUser = su;                        Thread th = new Thread(fun => { Application.Run(new FormMain()); });                        th.SetApartmentState(ApartmentState.STA);                        th.Start();                        this.Close();                    }                    else                        Common.ThrowMessage("账号或密码错误!", false, this);

    这一块的代码内容,则是为了读取数据库的数据,校验输入的账号和密码是否正确。下一节,我们将继续讲解这个校验的方法。

    展开全文
  • 微软winform控件中没有侧边导航栏,但这种导航栏在很多类型的项目中都需要,一些收费第三方控件库有相应的实现控件,如DotNetBar2,重点是收费,样式也老套。如何实现自己的导航栏呢?如何让自己的导航栏支持在设计...

    微软winform控件中没有侧边导航栏,但这种导航栏在很多类型的项目中都需要,一些收费第三方控件库有相应的实现控件,如DotNetBar2,重点是收费,样式也老套。

    如何实现自己的导航栏呢?

    如何让自己的导航栏支持在设计时的编辑和事件响应呢?

    eccb126a117ee15462a52bfa87abc77b.gif

    支持设计时展开、折叠

    实现自定义导航栏

    前置条件:GDI+

    1. 新增加一个自定义类从TreeView继承
    2. 处理TreeView的DrawNode事件,这里是关键,可以判断是哪一级节点,然后绘制不同的样式
    3. 根据节点级别,综合焦点、展开与否等条件绘制节点。绘制就是DrawString等。
    4. 处理NodeMouseClick事件,控制节点的展开及收起。

    https://github.com/wuqinchao/JwControls/blob/master/Jw.Winform.Ctrls/JwNavBar/JwNavBar.cs

    在设计时设置节点

    1. 新增加一个自定义设计器类,从ControlDesigner继承
    2. 在设计器类中增加我们自己的DesignerVerb,需要取个名称,对应一个点击事件处理方法
    3. 在DesignerVerb的事件处理方法中,我们可以通过this.Control获取到当前的TreeView, 也就可以拿到所有节点了。将节点交给下一步的对话框,处理完成后更新节点。
    4. 新建一个对话框窗口,同样放一个TreeView,接收到的节点放入这个控件,通过按钮增加、删除、修改节点,完成时返回编辑好的节点。
    948a7fadee88744cd5e33af89fd4a8e5.png

    节点编辑对话框

    https://github.com/wuqinchao/JwControls/blob/master/Jw.Winform.Ctrls/JwNavbar/JwNavbarDesigner.cs

    在设计时如何控制响应节点展开及收起

    控制节点展开及收起同样在设计器类中实现

    1. 增加一个自定义Behavior,从Behavior继承,重写OnMouseDown和OnMouseUp方法,检查判断鼠标点击事件,并调用控件Collapse和Expand实现折叠和展开。
    2. 增加自定义Glyph,从Glyph继承,构造时指定我们自定义的Behavior, 使我们能接收和响应鼠标事件。
    3. override设计器的GetGlyphs方法, 这个方法可以通过ISelectionService接口增加我们自定义的Glyph

    设计时支持比较繁琐,中文资料也很少,大家共同学习。

    展开全文
  •  /// 判断是否出现垂直滚动条  ///  /// name="ctrl">待测控件  /// 出现垂直滚动条返回true,否则为false  internal static bool IsVerticalScrollBarVisible(Control ctrl)  {  if (!ctrl....

     private const int WS_HSCROLL = 0x100000;
            private const int WS_VSCROLL = 0x200000;
            private const int GWL_STYLE = (-16);

            [System.Runtime.InteropServices.DllImport("user32",CharSet = System.Runtime.InteropServices.CharSet.Auto)]
            private static extern int GetWindowLong(IntPtr hwnd, int nIndex);

            /// <summary>
            /// 判断是否出现垂直滚动条
            /// </summary>
            /// <param name="ctrl">待测控件</param>
            /// <returns>出现垂直滚动条返回true,否则为false</returns>
            internal static bool IsVerticalScrollBarVisible(Control ctrl)
            {
                if (!ctrl.IsHandleCreated)
                    return false;

                return (GetWindowLong(ctrl.Handle, GWL_STYLE) & WS_VSCROLL) != 0;
            }

            /// <summary>
            /// 判断是否出现水平滚动条
            /// </summary>
            /// <param name="ctrl">待测控件</param>
            /// <returns>出现水平滚动条返回true,否则为false</returns>
            internal static bool IsHorizontalScrollBarVisible(Control ctrl)
            {
                if (!ctrl.IsHandleCreated)
                    return false;
                return (GetWindowLong(ctrl.Handle, GWL_STYLE) & WS_HSCROLL) != 0;
            }

    转载于:https://www.cnblogs.com/viuu/p/7451575.html

    展开全文
  • 今天分享一个以前实现的通讯录字母导航控件,下面自定义一个类似通讯录的字母导航 View,可以知道需要自定义的几个要素,如绘制字母指示器、绘制文字、触摸监听、坐标计算等,自定义完成之后能够达到的功能如下:...
    140d2f302d6f75eaaf412ab80e7396a7.png
    PS:如果不能严格内化自己,就没有足够的心理能量进行深度工作。
    今天分享一个以前实现的通讯录字母导航控件,下面自定义一个类似通讯录的字母导航 View,可以知道需要自定义的几个要素,如绘制字母指示器、绘制文字、触摸监听、坐标计算等,自定义完成之后能够达到的功能如下:
    • 完成列表数据与字母之间的相互联动;

    • 支持布局文件属性配置;

    • 在布局文件中能够配置相关属性,如字母颜色、字母字体大小、字母指示器颜色等属性。

    主要内容如下:
    1. 自定义属性

    2. Measure测量

    3. 坐标计算

    4. 绘制

    5. 显示效果

    自定义属性

    在 value 下面创建 attr.xml ,在里面配置需要自定义的属性,具体如下:
    <?xml  version="1.0" encoding="utf-8"?><resources><declare-styleable name="LetterView"><attr name="letterTextColor" format="color" /><attr name="letterTextSize" format="dimension" /><attr name="letterTextBackgroundColor" format="color" /><attr name="letterEnableIndicator" format="boolean" /><attr name="letterIndicatorColor" format="color" />declare-styleable>resources>
    然后在相应的构造方法中获取这些属性并进行相关属性的设置,具体如下:
    public LetterView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);//获取属性
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.LetterView);int letterTextColor = array.getColor(R.styleable.LetterView_letterTextColor, Color.RED);int letterTextBackgroundColor = array.getColor(R.styleable.LetterView_letterTextBackgroundColor, Color.WHITE);int letterIndicatorColor = array.getColor(R.styleable.LetterView_letterIndicatorColor, Color.parseColor("#333333"));float letterTextSize = array.getDimension(R.styleable.LetterView_letterTextSize, 12);
        enableIndicator = array.getBoolean(R.styleable.LetterView_letterEnableIndicator, true);//默认设置
        mContext = context;
        mLetterPaint = new Paint();
        mLetterPaint.setTextSize(letterTextSize);
        mLetterPaint.setColor(letterTextColor);
        mLetterPaint.setAntiAlias(true);
        mLetterIndicatorPaint = new Paint();
        mLetterIndicatorPaint.setStyle(Paint.Style.FILL);
        mLetterIndicatorPaint.setColor(letterIndicatorColor);
        mLetterIndicatorPaint.setAntiAlias(true);
        setBackgroundColor(letterTextBackgroundColor);
        array.recycle();
    }

    Measure测量

    要想精确的控制自定义的尺寸以及坐标,必须要测量出当前自定义 View 的宽高,然后才可以通过测量到的尺寸计算相关坐标,具体测量过程就是继承 View 重写 omMeasure() 方法完成测量,关键代码如下:
    @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//获取宽高的尺寸大小int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);//wrap_content默认宽高@SuppressLint("DrawAllocation") Rect mRect = new Rect();
        mLetterPaint.getTextBounds("A"01, mRect);
        mWidth = mRect.width() + dpToPx(mContext, 12);int mHeight = (mRect.height() + dpToPx(mContext, 5)) * letters.length;if (getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT &&
                getLayoutParams().height == ViewGroup.LayoutParams.WRAP_CONTENT) {
            setMeasuredDimension(mWidth, mHeight);
        } else if (getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT) {
            setMeasuredDimension(mWidth, heightSize);
        } else if (getLayoutParams().height == ViewGroup.LayoutParams.WRAP_CONTENT) {
            setMeasuredDimension(widthSize, mHeight);
        }
        mWidth = getMeasuredWidth();int averageItemHeight = getMeasuredHeight() / 28;int mOffset = averageItemHeight / 30//界面调整
        mItemHeight = averageItemHeight + mOffset;
    }

    坐标计算

    自定义 View 实际上就是在 View 上找到合适的位置,将自定义的元素有序的绘制出来即可,绘制过程最困难的就是如何根据具体需求计算合适的左边,至于绘制都是 API 的调用,只要坐标位置计算好了,自定义 View 绘制这一块应该就没有问题了,下面的图示主要是标注了字母指示器绘制的中心位置坐标的计算以及文字绘制的起点位置计算,绘制过程中要保证文字在指示器中心位置,参考如下:
    9bc7c3c4548bce4ca5716ae932bd63e2.png自定义字母导航

    绘制

    自定义 View 的绘制操作都是在 onDraw() 方法中进行的,这里主要使用到圆的绘制以及文字的绘制,具体就是 drawCircle() 和 drawText() 方法的使用,为避免文字被遮挡,需绘制字母指示器,然后再绘制字母,代码参考如下:
    @Overrideprotected void onDraw(Canvas canvas) {//获取字母宽高@SuppressLint("DrawAllocation") Rect rect = new Rect();
        mLetterPaint.getTextBounds("A"01, rect);int letterWidth = rect.width();int letterHeight = rect.height();//绘制指示器if (enableIndicator){for (int i = 1; i 1; i++) {if (mTouchIndex == i) {
                    canvas.drawCircle(0.5f * mWidth, i * mItemHeight - 0.5f * mItemHeight, 0.5f * mItemHeight, mLetterIndicatorPaint);
                }
            }
        }//绘制字母for (int i = 1; i 1; i++) {
            canvas.drawText(letters[i - 1], (mWidth - letterWidth) / 2, mItemHeight * i - 0.5f * mItemHeight + letterHeight / 2, mLetterPaint);
        }
    }
    到此为止,可以说 View 的基本绘制结束了,现在使用自定义的 View 界面能够显示出来了,只是还没有添加相关的事件操作,下面将在 View 的触摸事件里实现相关逻辑。

    Touch事件处理

    为了判断手指当前所在位置对应的是哪一个字母,需要获取当前触摸的坐标位置来计算字母索引,重新 onTouchEvent() 方法,监听 MotionEvent.ACTION_DOWN、MotionEvent.ACTION_MOVE 来计算索引位置,监听 MotionEvent.ACTION_UP 将获得结果回调出去,具体参考如下:
    @Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:
                isTouch = true;int y = (int) event.getY();
                Log.i("onTouchEvent","--y->" + y + "-y-dp-->" + DensityUtil.px2dp(getContext(), y));int index = y / mItemHeight;if (index != mTouchIndex && index 28 && index > 0) {
                    mTouchIndex = index;
                    Log.i("onTouchEvent","--mTouchIndex->" + mTouchIndex + "--position->" + mTouchIndex);
                }if (mOnLetterChangeListener != null && mTouchIndex > 0) {
                    mOnLetterChangeListener.onLetterListener(letters[mTouchIndex - 1]);
                }
                invalidate();break;case MotionEvent.ACTION_UP:
                isTouch = false;if (mOnLetterChangeListener != null && mTouchIndex > 0) {
                    mOnLetterChangeListener.onLetterDismissListener();
                }break;
        }return true;
    }
    到此为止,View 的自定义关键部分基本完成。

    数据组装

    字母导航的基本思路是将某个需要与字母匹配的字段转换为对应的字母,然后按照该字段对数据进行排序,最终使得通过某个数据字段的首字母就可以批匹配到相同首字母的数据了,这里将汉字转化为拼音使用的是 pinyin4j-2.5.0.jar ,然后对数据项按照首字母进行排序将数据展示到出来即可,汉字装换为拼音如下:
    //汉字转换为拼音public static String getChineseToPinyin(String chinese) {
        StringBuilder builder = new StringBuilder();
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);char[] charArray = chinese.toCharArray();for (char aCharArray : charArray) {if (Character.isSpaceChar(aCharArray)) {continue;
            }try {
                String[] pinyinArr = PinyinHelper.toHanyuPinyinStringArray(aCharArray, format);if (pinyinArr != null) {
                    builder.append(pinyinArr[0]);
                } else {
                    builder.append(aCharArray);
                }
            } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
                badHanyuPinyinOutputFormatCombination.printStackTrace();
                builder.append(aCharArray);
            }
        }return builder.toString();
    }
    至于数据排序使用 Comparator 接口即可,这里就不在赘述了,具体获取文末源码链接查看。

    显示效果

    显示效果如下:dbd12f53741b56b350e033273035b0b8.gif可以在公众号回复关键字【MLetterView】查看源码。推荐阅读:
    • Flutter系列之混合开发Android篇
    • 自定义View实现一个日期选择器

    • Flutter系列之Widget生命周期

    8da3b91d5e5dc15f1774c5767d99ecf6.png
    展开全文
  • 随机取点,均匀取点,低差异序列 生成射线后利用Raycast来判断Cell和被遮挡物之间是否有物体遮挡就可以了。Unity2019中才有DOTS的多线程物理,我们使用的2018版单线程Raycast烘焙速度非常慢,烘焙一个场景通常需要...
  • 用foreach 遍历窗口控件判断类型用 XXX is XXXX foreach (var item in Controls) { if (item is PictureBox) { //do something } if (item is Button) {
  • C# winform中对控件类型的判断: public void UpdataControl(Control control, string data) { if (control is TextBox) { doSomething1(); } if (control is Label) { doSomething1(); } if (control is...
  • RT,求判断控件是否被完全遮住的办法,或者半遮住的办法也行。 不要遍历控件的方法,或则通过控件之间的位置来判断,这类方法都不好。 求指导。
  • winform 对话框控件

    2017-06-04 15:33:00
    ColorDialog 可以调节颜色的控件,如果给一个按钮点击事件 ColorDialog.showdialog();...DialogResult.ok 这个只会判断你点的按钮是哪一个 这样如果点击确定,就会把里面输入的字都变成自己再...
  • NULL 博文链接:https://qingyanxiyu.iteye.com/blog/1175667
  • 本文转载:http://www.cnblogs.com/LinFx/archive/2011/12/23/2299895.html1.自定义控件, 和接口 interface IModify { bool IsModified { get; } } class TextBoxEx : TextBox, IModify { priv...
  • 前面用.Item试了下,结果是取到绑定在Combobox的数据,不管有没有选择,都会满足不为空的要求,后来就用Text试了下,满足我所需要的要求。(Combobox内我没有设置...控件属性名称。 加Trim()是为了去出空格。
  • 判断DataGridView控件滚动条是否滚动到当前已加载的数据行底部,其实方法很简单,就是为DataGridView控件添加Scroll事件,然后写入以下代码就可以了,应用范围:可实现分部加载数据,以提升用户体验! ? ...
  • 主要用的就是停靠窗体了,(十九)c#Winform自定义控件-停靠窗体,不了解的可以先去看一下 思路: 通过实体对象设置的对齐方式来实现左右对齐, 当鼠标进入一项的时候,判断是否弹出下拉列表,或关闭其他列表 开始 ...
  • 在contextMenuStrip的Opening事件里添加代码 private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) ...通过上面代码可以拿到控件的名称,拿到后就可以判断了。
  • 我在窗体上更改了CHECKBOX的CHECKED的状态,但是在程序中通过循环判断控件的状态,并不能得到CHECKBOX的Checked状态,已经勾选的控件,得到的CHECHED属性却是为FALSE,请问怎么解决。 另外,怎么通过程序,更改控件...
  • winform listbox控件简单使用。

    千次阅读 2017-12-11 17:02:11
    Winform控件ListBox的用法: 1、如何添加listbox的值:this.listboxname.item.add("xxxx");2、如何判断listbox是否已经添加过:if(this.listboxname.item.Contain("xxxx")) { MessageBox.show("已添加过此条信息"); ...
  • 判断DataGridView控件滚动条是否滚动到当前已加载的数据行底部,其实方法很简单,就是为DataGridView控件添加Scroll事件,然后写入以下代码就可以了,应用范围:可实现分部加载数据,以提升用户体验! 文章已发表于...
  • 要实现的功能:判断第一个文本框中输入的是不是字符 “a”。 最终效果: *当输入的不是a,控件旁会显示错误图标。当输入的是a,则错误图标会消失。 首先添加ErrorProvider控件。 代码: 1 ...
  • 3、在耗时操作中判断CancellationPending属性,如果为false则退出 4、如果要向用户界面发送信息,则调用BackgroundWorker的ReportProgress方法,它将调用ProgressChanged事件(可以将改变通过object类型传递) 5、在...
  • //首先在WINFORM中建两个LISTBOX,及一个右键菜单,右键菜单中的判断代码如下 //找出哪个Listbox调用的此菜单 ToolStripMenuItem mi = (ToolStripMenuItem)sender; ContextMenuStrip ms = (ContextMenuStrip)mi....
  • TextBox控件只能输入数字+小数 //通用方法 /// <summary> /// 判断文本框输入内容 /// </summary> /// <param name="sender"></param> /// <param name="e">KeyPr...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 275
精华内容 110
关键字:

winform判断控件